2012-05-04 29 views
1

使用knockoutjs映射插件2.11,我發現如果viewmodel(包含數組元素)使用ko.mapping.fromJS更新並且新數組元素的長度比舊的更長,ko.mapping.toJS會生成空數組項一。基因敲除映射到JS錯誤?空數組項目

我的映射的初始數據是:

var initData = {text: 'Some Text', 
       arr: [{key: 1, value: 'a'}, 
         {key: 2, value: 'b'}]}; 

然後我更新與新的對象視圖模型:

var newData = {text: 'Changed Text', 
       arr: [{key: 1, value: 'aa'}, 
         {key: 12, value: 'bb'}, 
         {key: 13, value: 'cc'}]}; 

之後我稱爲ko.mapping.toJS(),我發現第三個數組項是一個空對象。 我不確定這是一個錯誤還是我錯過了一些東西。我注意到的另一件事是,它只發生在我第一次更新數據時。如果我再次用initData和newData更新視圖模型,結果是正確的。 http://jsfiddle.net/gonglei/xgPSq/

編輯: 謝謝你的回答傑森。你的解決方案似乎不適合我真實項目中的情況。我需要檢索修改後的數據對象並將其發送到服務器。所以當我打電話給ko.mapping.toJS的那一刻,我希望我可以馬上得到正確的數據對象,而不僅僅是在計算函數中顯示JSON字符串。我在調用ko.mapping.toJS之後立即設置了一個斷點,並觀察數據對象,第三個元素確實是空的。我的服務器確實收到這個空的元素。油門擴展器確實給我正確的對象,但它是異步的方式。無論如何,我報告它是一個錯誤,看看開發者是否可以確認它或給我一個解決方案。

+0

最好的可能是在HTTPS報告這個bug ://github.com/SteveSanderson/knockout.mapping – Niko

+0

數據對象立即正確,並且ko.mapping.toJS返回正確的JSON,我認爲唯一的問題是ko.mapping.toJS不會導致計算觸發gui更改。 –

+0

我也遇到過在IE 9中Knockout映射填充集合中的空項目的問題。這個錯誤有時只會發生,這很難診斷。我有一個4項JSON數組,只填充第一個和最後一個項目([[object object] ,,, [object Object]])。怪怪的? –

回答

0

第三項不是空對象。你可以通過你的列表綁定,它具有價值看,即使你把這個在你的變化end()函數,它返回正確的JSON:

alert('JSON is ' + ko.mapping.toJSON(self.data)); 

也許ko.mapping.toJSON()沒有按註冊自己作爲依賴正確或它需要一些快捷方式,並不打算用於計算?

編輯

使用節流擴展到強制計算所有更改後發生的解決了這個問題(jsfiddle

this.json = ko.computed(function() { 
     return JSON.stringify(ko.mapping.toJS(self.data, mapping)); 
    }).extend({ throttle: 1 }); 
+0

謝謝你的回答傑森。雖然你的解決方案似乎不適合我的真實項目的情況。看到我編輯的問題。 – lei

+0

奇怪的是,當我在更改後立即將答案放入我的答案中時,我得到了正確的JSON。我發現唯一的問題是,計算器沒有立即觸發導致html更新,toJSON [總是](http://jsfiddle.net/EDt6f/)返回正確的答案。 –