2012-10-24 59 views
0

我建立一個應用程序在淘汰賽的早期版本,看起來像代碼:在knockoutjs中是對象克隆還是它們引用相同的東西?

this.activeProducts.remove(function(item) { //some code }) 

我能activeProducts重置爲:

var ProductCollection = function(products, metadata) { 
     var self = this; 
     this.allProducts = products; 
     this.activeProducts = ko.observableArray(products); 

然後,如果我從activeProduct陣列狀過濾掉的物品所有的產品通過做這樣的事情:

this.activeProducts(this.allProducts); 

但現在看起來好像如果我做刪除功能上面它的刪除產品。 allProducts也是...我傳遞的產品和設置鏈接到相同的參考或東西?我不明白爲什麼現在會發生這種情況,而不是以前。我希望能夠將this.activeProducts和this.allProducts作爲單獨的數組保存。

+2

'products'在這兩種情況下都是相同的數組。你會希望'activeProducts'或者是數組的副本('products.slice(0)'是一種快速的方法),或者你可以使用'computed'觀察值來表示你的產品的過濾版本。 –

回答

2

正如您的實驗所示,ko.observableArray()只是簡單包裝了底層陣列。它不會克隆底層數組,然後創建一個新的實例。

下面是來自該Knockout documentation更多:

的observableArray軌道哪些對象數組中......

的observableArray只跟蹤的對象其持有,而當對象被加入時通知偵聽或除去...

...您可以通過調用observableArray爲沒有參數的函數得到基本的JavaScript數組...

從技術上講,你可以使用任何的本地JavaScript陣列功能到底層陣列上運行...


// Thanks @RP Niemeyer 
this.activeProducts = ko.observableArray(products.slice(0)); 

// Deep copy with jQuery 
this.activeProducts = ko.observableArray(jQuery.extend(true, {}, products)); 

此外,如果你真的很好奇,有專門爲Javascript克隆一個完整的問題over here

+0

感謝您的回覆。你碰巧知道老版本Knockout是否爲你克隆了數據?它用於像我已經完成克隆一樣工作,而無需像上面顯示的那樣克隆它。 – michael

+0

@michael:嗯......我懷疑它。 Knockout的目標是成爲一個輕量級的JavaScript庫,並且我懷疑如果文檔沒有明確地說它會這樣的話,庫會代表你克隆數組。 –

相關問題