Backbone.js视图:我需要在视图上只取消一个事件

时间:2014-03-22 00:15:09

标签: events backbone.js view backbone-views

我有一个Backbone.View,其中包含以下事件:

...

events : {
    "click .text1" : "doSomething",
    "click .text2" : "doAnotherThing",
},

...

我需要取消第二次事件。我知道你可以使用this.undelegateEvents();但它取消了视图中的所有事件。我只需要取消一个事件。 我该怎么办?

2 个答案:

答案 0 :(得分:1)

来自fine manual

  

delegateEvents delegateEvents([events])

     

使用jQuery' on函数为视图中的DOM事件提供声明性回调。
  [...]
  当再次运行 delegateEvents 时,可能使用不同的events哈希值,所有回调都将被删除并重新委派 - 对于在不同模式下需要表现不同的视图非常有用。

注意两件事:

  1. 您可以将events对象传递给delegateEvents,默认情况下会使用this.events,但如果您愿意,可以使用不同的事件。
  2. 调用delegateEvents或多或少会在绑定新的undelegateEvents之前调用this.delegateEvents( _(this.events).omit('click .text2') );
  3. 把这些放在一起给了我们:

    _(this.events).omit('click .text2')

    作为一种简单的方法来删除您想要删除的单个事件处理程序。顺便说一句,_.omit只是为您提供了一个对象的副本,其中省略了某些键,因此可以使用this.events来获取您感兴趣的事件绑定,而无需更改{{1}}(其中附加到原型,因此您的视图的所有当前和未来实例共享。)

    演示:http://jsfiddle.net/ambiguous/T6ncT/

答案 1 :(得分:0)

来自骨干文档:

  

单个事件版本的 delegateEvents 可用作delegate。在   事实上, delegateEvents 只是围绕delegate的多事件包装器。   undelegateEvents的对应部分为undelegate

源代码中的函数是:

undelegate: function(eventName, selector, listener) {
  this.$el.off(eventName + '.delegateEvents' + this.cid, selector, listener);
  return this;
}

请致电this.undelegate("click",".text2")