我有一个Backbone.View,其中包含以下事件:
...
events : {
"click .text1" : "doSomething",
"click .text2" : "doAnotherThing",
},
...
我需要取消第二次事件。我知道你可以使用this.undelegateEvents();但它取消了视图中的所有事件。我只需要取消一个事件。 我该怎么办?
答案 0 :(得分:1)
来自fine manual:
delegateEvents
delegateEvents([events])
使用jQuery'
on
函数为视图中的DOM事件提供声明性回调。
[...]
当再次运行 delegateEvents 时,可能使用不同的events
哈希值,所有回调都将被删除并重新委派 - 对于在不同模式下需要表现不同的视图非常有用。
注意两件事:
events
对象传递给delegateEvents
,默认情况下会使用this.events
,但如果您愿意,可以使用不同的事件。delegateEvents
或多或少会在绑定新的undelegateEvents
之前调用this.delegateEvents(
_(this.events).omit('click .text2')
);
。把这些放在一起给了我们:
_(this.events).omit('click .text2')
作为一种简单的方法来删除您想要删除的单个事件处理程序。顺便说一句,_.omit
只是为您提供了一个对象的副本,其中省略了某些键,因此可以使用this.events
来获取您感兴趣的事件绑定,而无需更改{{1}}(其中附加到原型,因此您的视图的所有当前和未来实例共享。)
答案 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")
。