PhD*_*PhD 0 garbage-collection backbone.js
我们的Web应用程序中有一些遗留的非骨干代码.虽然我们附加views到现有的DOM元素,仍然有一些尚未重构的代码删除某些DOM元素,即删除调用不通过视图但更像是jQuery调用$('#domID').remove();
我有一种唠叨的感觉,骨干视图可能像僵尸一样挂着,但我没有办法看到它?这有害吗?我们是否应该优先重构并通过视图和调用view.remove()以及view.unbind()正确删除所有删除操作?
如果独立删除DOM节点,视图是否会被垃圾收集?我想如果不是,它是否与某些事件有关,但如果不是这样呢?
只有在某处有引用时,视图才会继续存在.有四种杂散参考来源需要考虑:
this.collection.on('reset', this.render)等等.events.$(...).on(...)调用绑定到DOM对象.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()删除视图将是一个好主意.
| 归档时间: |
|
| 查看次数: |
171 次 |
| 最近记录: |