我有一个标准的ajax调用,我从这里调用:
dataservice.createCard(card, function(serverData) {
var newCard = new cardViewModel(serverData);
// I see the right cardId here - from the server
var index = innerModel.cards().indexOf(card);
if (index !== -1) {
// this gets hit but the DOM doesn't change
innerModel.cards()[index] = newCard;
}
}
在我看来,我有这个:
<!-- ko foreach: data().cards -->
<p data-bind="text: cardId"></p>
<!-- /ko -->
现在当我点击“添加卡片”时,我将一张空白的cardViewModel插入卡片列表中。当用户点击保存时,我回发到服务器,当服务器响应异步调用时,在回调中我尝试用真实数据替换旧的“模板”。
问题是 - 除非我刷新页面,否则真实数据永远不会更新。如果我将初始cardId设置为某个字符串,那么在我获得实际数据之后该字符串仍然存在,而它应该变为Id。
我错过了什么?
我的innerModel映射:
var mapping = {
create: function (options) {
//customize at the root level.
var innerModel = ko.mapping.fromJS(options.data, {
'cards': {
create: function (options) {
var card = new cardViewModel(options.data);
return card;
}
}
});
}
如果还有什么我应该包括在这里,请告诉我。
答案 0 :(得分:0)
替换
innerModel.cards()[index] = newCard;
与
innerModel.cards.splice(index, 1, newCard);
第一行不允许Knockout知道发生了更新。