我有这段代码:
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);
Ajax返回:
[{
"title": "eric_schmidt",
"added_by": "xxx",
"thumb": "xxxxxx",
"id": 417,
"link": "/link/417",
"added_on": "2011-02-22T13:16:45-08:00"
}]
我希望明确一点,如果没有,请告诉我。当我使用updateFromJS
?
答案 0 :(得分:4)
ko.mapping.updateFromJS()希望您收到最初使用ko.mapping.fromJS()准备的项目的完整列表。原始中缺少的任何项目都被视为已删除,更新中的任何新项目都被视为添加项目。因此,目前映射插件不允许您以这种方式进行增量更新。
如果您正在进行增量更新,最好的办法是找到您需要更新的项目,并完全替换它们或替换每个项目上的单个可观察项。
答案 1 :(得分:0)
你总是可以尝试使用
$.extend(attachmentsModel.convAttachments,ko.mapping.fromJS(dataJS));
虽然我不太确定是否会正确更新所有绑定,但您可能必须通过调用
来回复绑定ko.applyBindings(attachmentsModel)