【问题标题】:Backbone.js Views: I need to undelegate only one event on a ViewBackbone.js 视图:我只需要取消对视图的一个事件的委托
【发布时间】:2014-03-22 00:15:08
【问题描述】:

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

...

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

...

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

【问题讨论】:

    标签: events backbone.js view backbone-views


    【解决方案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')
    );
    

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

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

    【讨论】:

      【解决方案2】:

      来自主干文档:

      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")

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-16
        相关资源
        最近更新 更多