0

私はこのコードを持っています:

var attachmentsModel = {
    convAttachments: ko.mapping.fromJS([])
};

$(function() {
    ko.applyBindings(attachmentsModel)
    refreshConvAttachments();
});

function refreshConvAttachments() {
    $.ajax({
        url: '/xxxxxxx/',
        success: function (dataJS) {
            // Send KO the data
            ko.mapping.updateFromJS(attachmentsModel.convAttachments, dataJS);
        }
    }); 
}

上記の AJAX 呼び出しは次を返します。

[{
    "title": "BillGates",
    "added_by": "xxx",
    "thumb": "urlhere",
    "id": 410,
    "link": "/link/410",
    "added_on": "2011-02-22T12:57:09-08:00"
}, {
    "title": "biz-stone",
    "added_by": "xxx",
    "urlhere",
    "id": 411,
    "link": "/link/411",
    "added_on": "2011-02-22T12:57:53-08:00"
}]

これはうまくいきます。後で、ユーザーは添付ファイルを追加できますが、それが壊れているところです。モードに新しいアタッチメントを追加してページに表示する間、attachmentsModel.convAttachments.

後で、これが起こります:

ko.mapping.updateFromJS(attachmentsModel.convAttachments, file);

アヤックスのリターン:

[{
    "title": "eric_schmidt",
    "added_by": "xxx",
    "thumb": "xxxxxx",
    "id": 417,
    "link": "/link/417",
    "added_on": "2011-02-22T13:16:45-08:00"
}]

明確な説明が得られることを願っています。そうでない場合はお知らせください。を使用すると、なぜknockoutjsがすべてを殺すのupdateFromJSでしょうか?

4

2 に答える 2

4

ko.mapping.updateFromJS() は、ko.mapping.fromJS() で最初に準備された項目の完全なリストを受け取ることを想定しています。元のアイテムから欠落しているアイテムは削除されたと見なされ、更新の新しいアイテムは追加と見なされます。そのため、現在、マッピング プラグインでは、この方法で増分更新を行うことはできません。

インクリメンタル更新を行っている場合、最善の策は、更新が必要な項目を見つけて、それらを完全に置き換えるか、各項目の個々の監視対象を置き換えることです。

于 2011-02-23T04:25:40.180 に答える
0

あなたはいつでも使ってみることができます

$.extend(attachmentsModel.convAttachments,ko.mapping.fromJS(dataJS));

それがすべてのバインディングを適切に更新するかどうかはよくわかりませんが、呼び出してバインディングに返信する必要があるかもしれません

ko.applyBindings(attachmentsModel)
于 2011-02-23T23:02:20.450 に答える