【问题标题】:Backbone View events don't get destroyed骨干视图事件不会被破坏
【发布时间】:2013-03-26 22:13:38
【问题描述】:

我在解除绑定视图事件时遇到了麻烦。我创建了一个视图,即

var myView = Backbone.View.extend({
    events : {
        "click .item"        : "nextPage",
        "scroll"             : "isScrolling",
        "click .zoom"        : "imageZoom"

    },
    initialize : function(){
       this.collection.on("reset", this.render, this);
    },
    onClose : function(){
      ... 
    }
 });

 var view = new myView();
     destroyArray.push(view);

一旦我需要销毁视图,我会通过路由器调用一个函数,该函数循环遍历销毁数组并在渲染下一个视图之前调用 destroyArray[i].close()(见下文)。

    Backbone.View.prototype.close = function(){

    this.undelegateEvents();
    this.$el.removeData().unbind();
    this.remove();
    if (this.onClose){
        this.onClose();
    }
}

close 函数明显地从页面中删除视图,但在视图中来回移动事件(和 DOM 元素)实际上增加了。有什么我做错了吗?

在视图之间移动时,我会重新初始化它们,即

 var view = new myView();
 destroyArray.push(view);
 ...
 view.close();
 ...
 var view1 = new myView1();
 destroyArray.push(view1);

我认为这可能会导致我的问题,但添加的事件不等于视图中绑定的事件数。

非常感谢任何帮助。谢谢。

【问题讨论】:

    标签: events backbone.js view destroy


    【解决方案1】:

    请查看 Backbone 0.9 中引入的 listenTo 方法,以帮助处理视图删除。
    你可以:

    initialize : function(){
        this.listenTo(this.collection, 'reset', this.render);
    }
    
    Backbone.View.prototype.close = function() {
        this.remove();
    }
    

    此外,您无需使用此方法指定上下文。

    编辑:代码看起来更像您最初的方式。

    【讨论】:

    • +1 你也可以在视图上调用 this.remove() 。这将调用 stopListening 作为一般清理的一部分。
    • 我正在尝试使用 listenTo,但现在我无法在视图中触发事件,即 view.trigger("eventname") 是否已更改?
    • 事件没有任何变化。你能把你的代码贴在问题所在吗?触发事件的对象和一个监听就足够了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多