在AJAX调用之后淘汰不更新observable?

时间:2013-07-09 20:25:17

标签: knockout.js knockout-mapping-plugin

我有一个标准的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;
                }
            }
        });
}

如果还有什么我应该包括在这里,请告诉我。

1 个答案:

答案 0 :(得分:0)

替换

innerModel.cards()[index] = newCard;

innerModel.cards.splice(index, 1, newCard);

第一行不允许Knockout知道发生了更新。