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() 准备的项目的完整列表。原始项目中缺少的任何项目都被视为已删除,更新中的任何新项目都被视为添加。因此,目前映射插件不允许您以这种方式进行增量更新。

如果您正在进行增量更新,最好的办法是找到需要更新的项目,然后完全替换它们或替换每个项目上的单个 observables。

于 2011-02-23T04:25:40.180 回答
0

你可以随时尝试使用

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

虽然我不太确定这是否会正确更新所有绑定,但您可能必须通过调用来回复绑定

ko.applyBindings(attachmentsModel)
于 2011-02-23T23:02:20.450 回答