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 に答える