骨干子视图删除无限循环

时间:2014-05-23 21:35:29

标签: backbone.js foreach underscore.js parent-child backbone-views

我试图通过修改Backbone.View.prototype来删除Backbone中的所有子视图:

_.extend(Backbone.View.prototype, {
childViews:[],
close: function(){
    this.remove();
    this.unbind();
    console.log(this.childViews.length);
    _.each(this.childViews,function(childview){
        childview.close();
    },this);
}
});

因此,当我创建子视图时,我{child} push。当我close时,我希望它也可以在childViews上调用close。如果它在childViews中没有任何内容,那么我希望close的链停止。 fiddle

最终发生的是某种无限循环。我无法弄清楚它为什么会这样。这是_.each [context]的问题吗?有人可以解释我做错了什么以及如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

您的问题是您已将childViews: []添加到原型中。这意味着每个视图实例将共享完全相同的childViews数组。一旦您在任何地方看到任何子视图,您最终会得到包含this.childViews的{​​{1}},并且您的无限循环。

相反,您应该在视图this中创建childViews

initialize

您可能需要更新initialize: function() { this.childViews = [ ]; //... } 方法以允许close undefined

更新了小提琴:http://jsfiddle.net/ambiguous/f2ykv/


根据经验,您几乎不需要附加到原型的任何可变属性(例如数组或对象),您几乎总是希望为每个实例分配这些属性。