0

我有一个从这里调用的标准 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;
                }
            }
        });
}

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

4

1 回答 1

0

代替

innerModel.cards()[index] = newCard;

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

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

于 2013-07-09T20:39:06.350 回答