从组件中解除绑定事件

时间:2013-06-27 09:03:24

标签: backbone.js

我有一个包含几个textarea组件的视图。问题是如何从单击的textarea解除“click”事件的绑定?只有特定的一个。

var StreamView = Backbone.View.extend({

 el: "#stream",

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

 addSendCommentButton : function(event) {

 this.undelegateEvents();

 }

});

3 个答案:

答案 0 :(得分:1)

如果您只想取消绑定特定事件,可以使用以下内容:

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

Backbone使用jQuery on将事件附加到特定的命名空间delegateEvents加上cid


我担心这也会解除其他文本中的事件。这是因为off方法需要与jQuery文档中传递给on的选择器相同的选择器:

  

要删除特定的委派事件处理程序,请提供选择器   论点。选择器字符串必须与传递给的字符串完全匹配   附加事件处理程序时的.on()。


建议

您可以使用类似的行为更改您的代码:

var StreamView = Backbone.View.extend({

 el: "#stream",

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

 addSendCommentButton : function(event) {

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

 }

});

使用更具体的选择器来附加事件,并在调用回调时删除该类。

答案 1 :(得分:0)

检查一下:

var StreamView = Backbone.View.extend({

     el: "#stream",

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

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

    });

答案 2 :(得分:0)

YD1m答案是正确的,但我想以另一种方式与您分享如何做到这一点。 如果您想要实现一次性事件,可以使用one jQuery方法。

您可以通过两种方式执行此操作:

  1. 通过覆盖delegateEvents方法
  2. 通过在渲染后附加事件 - this.$('textarea').one('click', _.bind(this. addSendCommentButton, this))