2012-11-27 23 views
1

我試圖從網格添加/加載記錄,編輯它在網格外,並有observablearray和UI更新。knockoutjs - 使用外部格式編輯項目從網格

演示:http://jsfiddle.net/DiegoVieira/ckMJE/98/

正如你會發現,沒有按照預期的添加或編輯的作品。 如果我添加一個新項目,它會添加到數組中,它反映了UI,但下次添加另一個項目時,會添加舊項目。

數據正從服務器拉出來,它具有30多個屬性,因此構建每個屬性爲ko.observable的對象不是一個選項。

例如

$.get('api/objects', function (data) { 
     self.stones(data.stones); // when the vm loads, this is empty 
     self.stone(data.stone); // when the vm loads, this is empty 
    }); 

在此先感謝。

+1

'data.stone'是同一個對象每次(在至少在這個例子中) –

+1

這個插件可能會有幫助:http://knockoutjs.com/documentation/plugins-mapping.html – subhaze

+0

#安德魯惠特克是的,我看到尼邁耶後注意到代碼。 –

回答

1

通常,你會想讓屬性可觀察。

如果這是不可能的,那麼一個選項是刪除並重新添加項目到數組中,以便它實際上被重新渲染。

當你添加「模板」的石頭,你會希望它是一個副本。 ko.toJS是獲取副本的快速方法。

所以,你可以這樣做:

self.addStone = function() { 
    self.stonesArray.push(ko.toJS(self.stoneData)); 
}; 

,並保存它喜歡:

self.saveStone = function (item) { 
    var index = self.stonesArray.indexOf(item); 
    self.stonesArray.remove(item); 
    self.stonesArray.splice(index, 0, item); 
    self.selectedStone(null); 
}; 

樣品:http://jsfiddle.net/rniemeyer/ckMJE/99/

+0

OMG謝謝Niemeyer,我非常感謝你的工作,並告訴我我失蹤的地方。 –