1

我試圖通過修改Backbone.View.prototype像這樣以消除骨幹所有子視圖:骨幹子視圖去除無限循環

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

所以,當我創建一個子視圖,我push到childViews。當我close我希望它也可以在子視圖上調用close。如果它在childViews中沒有任何內容,那麼我預計鏈接close停止。 fiddle

最終發生的是某種無限循環。我無法弄清楚它爲什麼會這樣。 _.each[context]是否有問題?有人可以解釋我做錯了什麼,以及如何解決這個問題?

回答

2

您的問題是您已將childViews: []添加到原型。這意味着每個視圖實例將共享完全相同的childViews數組。一旦你在任何地方看到任何孩子的景象,你將最終得到this.childViews包含this,並有你的無限循環。

相反,你應該創造childViews視圖的initialize

initialize: function() { 
    this.childViews = [ ]; 
    //... 
} 

您可能需要更新您的close法允許的undefinedthis.childViews爲好。

更新後的提琴:http://jsfiddle.net/ambiguous/f2ykv/


作爲一個經驗法則,你幾乎永遠不希望任何可變特性(如數組或對象)連接到原型,你幾乎總是需要每個實例分配這些屬性。