私はかなり長い間これを理解しようとしてきました。この問題に対処するものは見つかりませんでしたが、間違っている場合は修正してください。
問題: ネストされた配列/オブジェクト構造を持つ JSON API からのデータが入ってきます。マッピングを使用して、最初にモデルにデータを入力します。これを更新するには、新しいデータが届いたらモデルを拡張するか、既存のデータを更新します。
私の知る限り、マッピング オプション キーはこのトリックを実行するはずですが、マッピング オプションの機能を誤解している可能性があります。
この例で表されるように、問題を煮詰めました。
var userMapping = {
key: function(item) {
return ko.utils.unwrapObservable(item.id);
}
};
// JSON call replaced with values
var viewModel = {
users: ko.mapping.fromJS([], userMapping)
};
// Should insert new - new ID?
ko.mapping.fromJS([{"id":1,"name":"Foo"}, {"id":2,"name":"Bar"}], userMapping, viewModel.users);
// Should only update ID#1 - same ID?
ko.mapping.fromJS([{"id":1,"name":"Bat"}], userMapping, viewModel.users);
// Should insert new - New ID?
ko.mapping.fromJS([{"id":3,"name":"New"}, {"id":4,"name":"New"}], userMapping, viewModel.users);
ko.applyBindings(viewModel);
フィドル: http://jsfiddle.net/mikaelbr/gDjA7/
ご覧のとおり、最初の行でデータが挿入されます。すべて良い。しかし、更新しようとすると、コンテンツが置き換えられます。3 番目のマッピングも同様です。コンテンツを拡張するのではなく、コンテンツを置き換えます。
私はそれを間違って使用していますか?マッピングを使用する前に、コンテンツを「手動で」拡張しようとする必要がありますか?
解決策の編集:
現在のすべてのモデルを格納する 2 番目のヘルパー配列を用意することで、このケースを解決しました。新しいデータでは、この配列を拡張し、ビュー モデルを更新して蓄積されたアイテムを含めました。
更新時 (私の場合は WebSocket メッセージ)、モデルをループし、問題の項目の内容を変更し、メソッド valueHasMutated() を使用して値の変更を Knockout ライブラリに通知しました。