Backbone 从以前的视图中删除事件

Backbone remove events from previous view

可能是对Backbone的事件机制不了解导致的问题

要么我得到以前的事件仍然附加,要么当前事件没有触发。

  1. 如果我不使用$('body').off()this.$el.off()(我的目标是body)显然一切都会保留因为Backbone的事件模型附加并收听 body.

  2. 上传播的内容
  3. 如果我在initialize方法中使用$('body').off()this.$el.off(),像这样:

    module.exports = Backbone.View.extend({
        initialize: function(){
            this.KontaktViewTemplate = $.ajax({ url:'index.php/templateget/kontakt', dataType:'text', cache:true});
            this.$el.off();
            this.render();
        },
        render: function(){
            var $el = this.$el;
            this.KontaktViewTemplate.done(function(text){
                $el.html(text);
            });
        },
        events: {
            'click div': "Alert"
        },
        Alert: function(){
            alert('Example');
        }
    });
    

我什至不'click div': "Alert"工作。

我最好的猜测是来自 Backbone 的 View 的事件甚至在调用 initialize 方法之前就已附加,因此 .off() 调用来得太晚并将它们清除.

我应该在 Backbone 之外处理吗?

Backbone 视图的事件只是命名空间 jQuery 事件 (source).

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

它们在视图构造函数中 initialize 之前的 setElement function (source) which is called in _ensureElement 中被委托。

如果一个元素与多个 Backbone 视图共享,或者如果您在多个地方重复使用相同的视图,您可能会遇到事件仍然附加或加倍的问题。

假设您的视图与默认视图一样 div 并且您希望它使用现有元素 <div id="existing"></div> 并且 div 已经附加了事件。

您将执行以下操作:

view.setElement($('#existing'));

setElement 将首先取消委派来自 view 的事件。其他地方附加的任何事件仍将附加。然后,它从 events 视图 属性.

中委托事件

此外,在视图上调用 remove (source) 将显式取消委托附加到该元素的任何事件。