在删除相应的DOM节点后,骨干视图是否会延续?

PhD*_*PhD 0 garbage-collection backbone.js

我们的Web应用程序中有一些遗留的非骨干代码.虽然我们附加views到现有的DOM元素,仍然有一些尚未重构的代码删除某些DOM元素,即删除调用不通过视图但更像是jQuery调用$('#domID').remove();

我有一种唠叨的感觉,骨干视图可能像僵尸一样挂着,但我没有办法看到它?这有害吗?我们是否应该优先重构并通过视图和调用view.remove()以及view.unbind()正确删除所有删除操作?

如果独立删除DOM节点,视图是否会被垃圾收集?我想如果不是,它是否与某些事件有关,但如果不是这样呢?

mu *_*ort 5

只有在某处有引用时,视图才会继续存在.有四种杂散参考来源需要考虑:

  1. 绑定到模型和集合,即this.collection.on('reset', this.render)等等.
  2. 通过视图绑定到DOM对象events.
  3. 通过直接$(...).on(...)调用绑定到DOM对象.
  4. 简单的旧变量引用,如this.current_view = new V(...).

(1)通常由视图的remove方法处理,你必须remove自己调用,Backbone或jQuery中没有任何东西可以为你做这件事.例如:http://jsfiddle.net/ambiguous/e574Z/

(2)很容易.骨干视图使用单个delegate调用将视图的事件绑定到视图el.因此,如果您el通过简单删除视图,$(x).remove()则事件参考将消失.但是,如果您将不同的视图附加到同一视图,则el需要调用undelegateEvents以分离delegate; 这通常是在一种remove方法中完成的:

remove: function() {
    this.undelegateEvents();
    return this;
}
Run Code Online (Sandbox Code Playgroud)

但是,再次,你必须在remove某个地方称呼自己.

(3)很少见,但有时需要窗口滚动事件,对话框的正文单击事件以及类似的事情.当然,你必须自己清理它们,因为Backbone无法知道你背后所做的是什么,你绑定的元素将在视图之外el(或者你在(2)中) .你会在哪里清理这些?该remove过程的方法.

(4)一如既往地取决于你.通常,这种事情是这样处理的:

if(this.current_view)
    this.current_view.remove();
this.current_view = null;
Run Code Online (Sandbox Code Playgroud)

是的,还有remove.


所以,如果你所有的事情一样(2) ,然后$('#domID').remove();将被罚款,不应留下任何僵尸; 事实上,默认remove实现只是this.$el.remove()和文档说的一样多:

去掉 view.remove()

用于从DOM中删除视图的便捷功能.相当于召唤$(view.el).remove();

但是,您可能还有一些事情((1)),因此添加/更新所有remove方法并调用view.remove()删除视图将是一个好主意.