2013-06-27 3 views
1

У меня есть представление, которое содержит несколько компонентов textarea. Вопрос заключается в том, как отключить событие «click» из текстового поля, которое было нажато? Только от конкретного.Отвязывающее событие от компонента

var StreamView = Backbone.View.extend({ 

el: "#stream", 

events: { 
"click textarea" : "addSendCommentButton" 
}, 

addSendCommentButton : function(event) { 

this.undelegateEvents(); 

} 

}); 

ответ

1

Если вы хотите, чтобы отвязать только конкретное событие, которое вы можете использовать что-то вроде этого:

addSendCommentButton : function(event) { 
    this.$el.off('click.delegateEvents' + this.cid, 'textarea'); 
} 

Ba ckbone присоединяет события, используя jQuery on с определенным пространством имен delegateEvents плюс cid.


Я боюсь, что это также отвязывает события из других текстовых областей. Это объясняется тем, что метод off нужен один и тот же селектор, что переданный on, как сказано в документации JQuery:

Для удаления определенных делегированных обработчиков событий, обеспечить селектор аргумент. Строка селектора должна точно соответствовать той, которая была передана в .on(), когда обработчик события был присоединен.


Предложение

Вы можете иметь подобное поведение меняется немного код:

var StreamView = Backbone.View.extend({ 

el: "#stream", 

events: { 
"click textarea.unfinished" : "addSendCommentButton" 
}, 

addSendCommentButton : function(event) { 

    $(event.target).removeClass("unfinished"); 

} 

}); 

Используйте более конкретный селектор, чтобы прикрепить событие и удалить этот класс, когда обратный вызов называется.

+0

Сначала оль все thx для ответа. К сожалению, он также отвязывает события от других компонентов textarea. Обратите внимание, что StreamView содержит много компонентов textarea («#stream» div содержит много текстовых областей). – syllepsa

+0

@syllepsa проверить отредактированный –

+0

Это работает. Спасибо. К сожалению, я не могу голосовать (голосование требует 15 очков репутации). – syllepsa

0

Проверьте это:

var StreamView = Backbone.View.extend({ 

    el: "#stream", 

    events: { 
    "click textarea" : "addSendCommentButton" 
    }, 

    addSendCommentButton : function(e) { 
     e.target.removeEventListener('click', 'addSendCommentButton'); 
    } 

    }); 
+0

Это не работает, в рамках 'addSendCommentButton'' this' является объектом Backbone, который не имеет метода 'removeEventListener' –

+0

. Попробуйте' event.target' – YD1m

+0

Это тоже не работает, слушатель не подключен 'addSendCommentButton', но функция, возвращаемая методом подчеркивания' bind' (см. исходный код Backbone) –

0

YD1m ответ правильный, но я хочу поделиться с вами еще один способ, как это сделать. Если вы хотите реализовать одноразовое событие, вы можете использовать метод jQuery one.

Вы можете сделать это двумя способами:

  1. Переопределелив delegateEvents метод
  2. Добавляя событие после рендеринга - this.$('textarea').one('click', _.bind(this. addSendCommentButton, this))