6

私はかなり長い間これを理解しようとしてきました。この問題に対処するものは見つかりませんでしたが、間違っている場合は修正してください。

問題: ネストされた配列/オブジェクト構造を持つ 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 ライブラリに通知しました。

4

3 に答える 3

4

サンプル コードを見ると、マッピング プラグインは期待どおりに動作しています。コレクションを呼び出すfromJSと、効果的にこれがそのコレクションの新しいコンテンツであることをマッピング プラグインに伝えます。例えば:

2 行目では、更新中なのか、単に id:2 を削除しただけなのかをどのようにして知ることができますか?

追加することはできますが、データを単なる更新として扱う適切な方法についての言及は見つかりません。mappedIndexOfマップされた配列には、特定のアイテムを見つけるのに役立つなど、いくつかの便利なメソッドが付属しています。更新データ セットを受け取った場合は、単純にループして、アイテムを見つけ、その特定のアイテムへの mapping.fromJS 呼び出しで更新します。これは、再利用可能な方法に簡単に一般化できます。

于 2012-03-09T17:05:25.673 に答える
1

を使用ko.mapping.updateFromJS()して、既存の値を更新できます。ただし、新しい値は追加されないため、インスタンスで問題が発生します。詳細については、以下のリンクをご覧ください。

updateFromJS を使用すると、値を追加する必要があるときに値が置き換えられます

于 2012-03-09T16:43:38.023 に答える
0

はい、最初にすべてのデータをリストまたは配列に収集してから、そのリストにマッピングを適用する必要があります。それ以外の場合は、viewModelの値を上書きします。

于 2012-03-09T15:52:12.267 に答える