Backbone从上一个视图中删除事件

时间:2016-12-22 16:19:58

标签: javascript jquery backbone.js

我可能因为缺乏对Backbone的事件机制的理解而导致麻烦。

要么以前的事件仍然附加,当前事件没有被解雇。

  1. 如果我不使用$('body').off()this.$el.off()(我的目标是body),显然一切都是因为Backbone的事件模特附加&听取body上传播的内容。

  2. 如果我在$('body').off()方法中使用this.$el.off()initialize,请执行以下操作:

    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');
        }
    });
    
  3. 我甚至没有让'click div': "Alert"工作。

    我最好猜测,即使在调用View方法之前,Backbone initialize的事件也会被附加,因此.off()调用来得太迟并将其清除。

    我应该在Backbone之外处理这个吗?

1 个答案:

答案 0 :(得分:0)

Backbone View的事件只是命名空间的jQuery事件(source)。

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

它们在setElement functionsource)内委托,该_ensureElement removeinitialize中在{1}}之前在View的构造函数中调用。

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

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

你会做类似的事情:

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

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

此外,在视图上调用sourceenter image description here)将明确取消附加到该元素的任何事件。