2012-08-23 49 views
3

我遇到了一個我無法解釋的場景/錯誤,因爲我有一個具有數組變量的Backbone View類,但是即使在我重新實例化它之後該變量值仍然存在。骨幹觀點有以下設置:BackboneJS - 查看重新實例化後保留的類數組變量

var TestView = Backbone.View.extend({ 
    a:"", 
    b:"", 
    items:[], 
    initialize:function(){ 

    }, 
    add:function(value){ 
     this.items.push(value); 
    } 
}); 

這是我如何實例化類:

this.formView = new TestView(); 
this.formView.add('halo'); 
this.formView.a = 'abc'; 

this.formView = new TestView(); 
this.formView.add('test'); 
this.formView.b = 'bcd'; 

console.log("a - " + this.formView.a); 
console.log("b - " + this.formView.b); 
console.log("items - "); 
console.log(this.formView.items); 
​ 

結果:

a - 
b - bcd 
items - ["halo", "test"] 

出人意料的是,數組變量 '項目' 繼續存在,它所示的兩種['halo','test']在一起。但不適用於正常變量。

這裏是JsFiddle link

它可以通過在初始化函數中清除數組來解決。

initialize:function(){ 
     this.items = []; 
    }, 

但我想知道這是一個錯誤還是我誤解了一些東西。

+0

我認爲由於某種原因,在重新實例化期間formView沒有實例化畢竟 – Deeptechtons

回答

7

嗯,這個問題很棘手,但它有一個解釋。

首先不是好主意,在類上下文定義實例變量這是你這個做什麼:

var TestView = Backbone.View.extend({ 
    a: "", 
    b: "", 
    items: [] 
}); 

這是原因之一Model.defaults存在。你更應該這樣:

var TestView = Backbone.View.extend({ 
    initialize: function(){ 
    this.a = ""; 
    this.b = ""; 
    this.items = []; 
    } 
}); 

什麼是你的示例代碼發生的事情是,所有的TestView新的引用將分享StringArray相同的實例。這是因爲在一個實例中更改數組將反映在另一個實例中。

最棘手的事情,你敏捷觀察,是它看起來像共享行爲沒有發生與字符串,但事實上它正在發生。

正在發生的事情是,當你這樣做:

this.formView.a = 'abc'; 

你是不是轉化字符串實例,但如此原始的字符串實例保持不變替換它換一個新的。

我想提供一個TestView實例操縱字符串的例子,看到的變化在其他TestView實例反映,但我不發現操縱就地字符串任何JS String method

+0

感謝編輯@ muistooshort ...並祝賀100k,或者我應該說感謝100k :) – fguillen