1

knockoutjs マッピング プラグイン 2.11 では、viewmodel (配列要素を含む) が ko.mapping.fromJS で更新され、新しい配列要素の長さが古いものよりも長い場合、ko.mapping.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 番目の配列項目が空のオブジェクトであることがわかりました。これがバグなのか、何かを見逃したのかはわかりません。私が気付いたもう1つのことは、データを初めて更新したときにのみ発生することです。ビュー モデルを initData で更新してから newData で更新すると、結果は正しくなります。http://jsfiddle.net/gonglei/xgPSq/

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

4

1 に答える 1

0

3 番目の項目は空のオブジェクトではありません。リスト バインディングで値があることを確認できます。これを change() 関数の最後に配置しても、正しい 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 });
于 2012-05-06T07:46:15.080 に答える