Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 防止主干僵尸视图_Backbone.js_Backbone Views_Backbone Events - Fatal编程技术网

Backbone.js 防止主干僵尸视图

Backbone.js 防止主干僵尸视图,backbone.js,backbone-views,backbone-events,Backbone.js,Backbone Views,Backbone Events,注意:我们使用的是主干网1.0.0 我对主干网还比较陌生,我正准备阅读一位前同事写的一些代码。我不想盲目地复制粘贴东西,而是想了解他是如何做的,从那时起,我开始思考处理僵尸视图的最佳方法 var view = new editItemView({ model: this.model }); this.ui.editItemPopup.html(view.render().el).modal({ modalOverflow: true }); 这将创建一个视图实例,并在boostrap模

注意:我们使用的是主干网1.0.0

我对主干网还比较陌生,我正准备阅读一位前同事写的一些代码。我不想盲目地复制粘贴东西,而是想了解他是如何做的,从那时起,我开始思考处理僵尸视图的最佳方法

var view = new editItemView({ model: this.model });
    this.ui.editItemPopup.html(view.render().el).modal({ modalOverflow: true });
这将创建一个视图实例,并在boostrap模式中弹出它。模型具有保存更改、取消和删除按钮。我们将看看在保存更改和删除上所做的干净工作

onDelete: function() {
    this.stopListening(this.model);
    this.$el.parent().modal('hide');
    this.$el.remove();
},
onApplyChangesClick: function () {
    this.stopListening(this.model);
    this.close();
},
close: function () {
    this.$el.parent().modal('hide');
}
据我所知,这段代码不会放弃视图。如果我要在上述视图中添加另一个侦听器

this.listenTo(this.model.AnotherItem, 'change', this.doSomething);
然后在this.model.AnotherItem上触发更改事件,this.doSomething仍将激发。对吗

在发布这个问题之前,我读了一些关于僵尸观点的文章

基于那篇文章,如果我这么做了,我不是会更好吗

 onDelete: function() {
    this.close()
},
onApplyChangesClick: function () {
    this.close();
},
close: function () {
    this.$el.parent().modal('hide');
    this.remove();
}
his.remove()将自动调用stopListening并删除dom元素(与此相同。$el.remove)

我发布的文章也使用了这个.unbind()

this.unbind()
将解除绑定视图直接触发的任何事件,也就是说,任何时候我们都可以从视图中调用this.trigger(…)`以使视图引发事件

在主干网1.0.0(或最新版本)中仍然需要这样做吗?这篇文章已经3年了,所以我想知道,在主干文档中找不到任何关于view.unbind的内容。文档提到unbind是off的别名。我该怎么办

this.remove();
this.off();

好的,首先让我陈述一个显而易见的事实:这里或那里的一些僵尸视图不会给你带来任何问题。任何给定的僵尸视图都会消耗少量内存,然后在用户点击刷新或导航时消失。所以,如果你在清理你的参考资料方面有点马虎,一般情况下,事情还是可以的。遇到问题的地方是当你有很多僵尸视图时,比如说,因为你渲染了一个20x100的表格,其中每个单元格都有自己的
视图

现在,要真正了解如何避免僵尸视图,您必须了解Javascript中内存是如何工作的。我鼓励您在其他地方阅读更多关于这方面的内容,但这是cliff notes的版本:您“停止使用”的任何内容都会被浏览器的垃圾收集器清除,而且由于垃圾收集器无法准确地告诉您何时“停止使用”某个内容,因此它实际上会根据该内容在其他对象上是否有任何引用来判断

这就是事件绑定发挥作用的地方,因为它们可以创建防止视图被垃圾收集的引用。主干网的一个特性是,如果这些绑定是作为
主干网.View
初始化的一部分创建的,它将处理这些绑定的清理(即,将事件放入
View
类的
events
属性中)。因此,如果从页面中删除
视图
的元素,它将被垃圾回收


。。。除非它有其他引用,比如使用它的另一个对象,或者使用jQuery创建的事件绑定。因此,只要您的
视图
没有任何其他引用,您就是正确的:只需删除元素就足够了。但是,如果您确实有任何其他引用,则需要清理它们,否则
视图将不会被垃圾收集,并将成为僵尸视图。

谢谢。您的回答帮助我对垃圾收集和僵尸视图有了更多的了解。我在示例中使用的视图被其他对象引用,在阅读了您的响应之后,这些对象现在变得更有意义。我肯定会读更多关于内存和垃圾收集的内容。:)嘿,Mogambo-既然这个答案很有帮助,你能不能把它标记为正确的-这让搜索同一主题的用户更加可信。谢谢