2013-05-06 102 views
0

我有一個對象addItem與幾個可觀察的屬性。一旦屬性填充後,我將其推入一個可觀察的數組allItems,該數組跟蹤會話期間創建的所有對象。在可觀察數組中使用可觀察屬性推送對象仍然會跟蹤對象的屬性。

問題是,當我將addItem插入allItems,然後更改addItem; allItems也發生變化。我認爲,一旦addItem被推入allItems兩者之間的綁定將不再是,但它看起來像推只是增加了一個參考。

我怎樣才能添加到addItemallItems參考?

+0

你能表現出一定的代碼?但總的來說,你必須自己複製你的屬性... – nemesv 2013-05-06 13:31:30

+0

如果你不想allItems接收通知,因爲其中一個項目發生變化,然後發送一個更新的緣故吧,你只需要一個簡單的數組,而不是可觀察數組,不是? – Jalayn 2013-05-06 13:34:50

+0

@Jalayn,'ko.observableArray'只會在實際的數組發生變化時(即項目被添加,刪除或替換)通知。如果項目上的屬性發生更改,則可觀察數組不會跟蹤這些更改,因此不會通知數組訂閱者。 – 2013-05-06 13:59:29

回答

3

默認情況下,ko.observable項目仍然會觀察到它們被添加到一個陣列中後。如果要刪除可觀察性,則需要創建一個具有不可觀察屬性的對象。

一種方式是手工屬性複製,使用ko.utils.unwrapObservable(obj.prop)

更「自動」的方式是使用ko.toJS() - 這將對象轉換與可觀察到的性質成平紋JS對象。

self.allItems.push(ko.toJS(self.item2)); 

,或者如果要單獨維持可觀的項目數組裏面,你可以使用ko.mapping.fromJS重新進行添加它:

allItems.push(ko.mapping.fromJS(ko.toJS(self.item2))); 

See the Fiddle

相關問題