2012-05-04 8 views
1

knockoutjsマッピングプラグイン2.11では、viewmodel(配列要素を含む)がko.mapping.fromJSで更新され、新しい配列要素の長さが古いものより長い場合、ko.mapping.toJSが空の配列項目を生成していました1。ノックアウトマッピングtoJSバグ?空の配列項目

私の最初のデータがマッピングされている:

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と呼ばれる)、私がことがわかりました3番目の配列アイテムは空のオブジェクトです。 これがバグか何かを逃したかどうかわかりません。私が気付いたもう一つの事は、データを更新するのは初めてだということです。 initDataでビューモデルを更新してからnewDataを再度更新すると、結果は正しいです。 http://jsfiddle.net/gonglei/xgPSq/

編集: 回答ありがとうございました。あなたのソリューションは私の実際のプロジェクトで私の状況に合わないようです。私は、変更されたデータオブジェクトを取得し、それをサーバーに送信する必要があります。ですから、私がko.mapping.toJSと呼んでいる瞬間に、計算された関数にJSON文字列を表示するのではなく、すぐに正しいデータオブジェクトを取得できることを願っています。私はko.mapping.toJSの呼び出しの直後にブレークポイントを置き、データオブジェクトを監視し、3番目の要素は実際には空です。私のサーバーはこの空の要素を受け取りました。スロットルエクステンダーは私に正しいオブジェクトを手に入れましたが、それは非同期的な方法です。とにかく私はバグとして報告しました。開発者がそれを確認できるかどうか、または私に解決策を教えてください。

+0

最高のは、おそらくHTTPSでこのバグを報告することです://github.com/SteveSanderson/knockout.mapping – Niko

+0

データオブジェクトは直ちに正しいので、ko.mapping.toJSは正しいJSONを返します。唯一の問題は、計算結果がGUIの変更を引き起こさないようにko.mapping.toJSだと思います。 –

+0

私はノックアウトマッピングがコレクション内の空のアイテムを埋めるIE 9の問題も経験しました。このエラーは時々発生するだけで、診断が難しくなります。最初と最後の項目([[object object] ,,, [object Object]])のみを設定した4項目のJSON配列がありました。奇妙なのね? –

答えて

0

3番目の項目は空のオブジェクトではありません。 doesnの)(

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

多分ko.mapping.toJSON:あなたはあなたのリストは、それが値を持っていることを結合することによって見ることができ、そして、あなたの変更の末尾に()関数を、これを入れていても、それが正しいJSONを返します。適切に従属するものとして登録するか、またはいくつかのショートカットを使用し、計算されたもので使用されることを意図していませんか?すべての変更が行われた後に発生する計算を強制的にスロットルエクステンダーを使用して

編集

jsfiddle)問題を解決

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

あなたの答えJasonに感謝します。あなたのソリューションは私の実際のプロジェクトで私の状況に合っていないようですが。私の編集した質問を参照してください。 – lei

+0

これは奇妙なことですが、変更後すぐに私の警告にアラートを入れると、正しいJSONが得られます。私が見つけた唯一の問題は、計算結果がすぐに起動してhtmlが更新されなかったことです。toJSON [常に](http://jsfiddle.net/EDt6f/)が正しい答えを返しました。 –

関連する問題