【问题标题】:Zombie object not removed by remove() method in backbone.js僵尸对象没有被主干.js 中的 remove() 方法删除
【发布时间】:2013-06-19 11:35:46
【问题描述】:

我正在用backbone.js 开发一个小型Web 应用程序。在一个视图中,我使用 setInterval 方法来提供一些动画效果。我通过递增变量index 以3s 的间隔更改img 标签的src 属性。

问题是当我重新进入同一个视图时,索引变量在不到 3 秒的时间内递增。有时小于1s。

在重新渲染视图之前,我将使用以下代码关闭已经存在的视图以避免僵尸对象。

我的路由器

搜索页面:

    function(data) {

    if(!directory.myview){

       directory.myview=new directory.SearchView({model:data}); 

    }
 else{

   directory.myview.close();
       directory.myview=new directory.SearchView({model:data});

   }

   // code to append the rendered view to html page comes here 

}

我的观点

directory.SearchView = Backbone.View.extend({
render:function () {
    this.$el.html(this.template(this.model));
    return this;
},
close :function()
{       
    this.unbind();
    this.remove();
    delete this.$el; 
    delete this.el;
}

});

【问题讨论】:

  • 你能说明你在哪里使用setInterval方法吗?
  • 如果您使用listenTo 绑定事件,则不再需要close 函数,View#remove 将完成自 Backbone 0.9.9 以来所需的一切。但是,在使用clearInterval 启动新方法之前,您是否真的停止了setInterval 方法?如果不是,则仍然有对您删除的视图的引用,并且该视图不能被垃圾回收。
  • 谢谢先生。 Loamhoof .. 我重新检查了 clearInterval 的代码。问题就在那里。 setInterval 的参考变量在 application 的一部分发生了变化。所以现在我正确设置了参考变量。并且工作正常

标签: javascript backbone.js setinterval backbone-views zombie-process


【解决方案1】:

我怀疑您关闭时的顺序是导致问题的原因。删除 ui 元素后,您应该删除视图。

close :function()
{       
    this.unbind();

    delete this.$el; 
    delete this.el;
    //remove should be last after you delete and unbind
    this.remove();
}

【讨论】:

    【解决方案2】:

    您可能想阅读 Derick Bailey 发布的 zombies-run-managing-page-transitions-in-backbone-apps。这是一本很好的读物,一旦您了解了下划线机制,您可能希望使用backbone.marionette 来管理您的视图。

    【讨论】:

    • 这篇文章已经过时了。他所说的问题已通过在 Backbone 0.9.9 中引入 listenTostopListening 方法得到解决。 Marionette 早已进化,不再真正用于避免僵尸视图的目的。
    • 感谢指正:-)通过问题发帖的方式,觉得把帖子发上来很有价值:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 2012-10-13
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    相关资源
    最近更新 更多