2

私はデュランダルビューモデルを次のように動作させています:

define(function (require) {
var http = require('durandal/http');

return {
    subjectItem: function (data) {
        var self = this;
        self.Subject_ID = data.Subject_ID;
        self.Subject_Name = data.Subject_Name;
    },
    subjects: ko.observableArray([]),
    activate: function () {
        var self = this;
        http.ajaxRequest("get", "/api/values/getsubjects")
            .done(function (allData) {
                var mappedSubjects = $.map(allData, function (list) { return new self.subjectItem(list); });
                self.subjects(mappedSubjects);
            });
    }
};
});

ただし、最初にこのビューに移動すると、ajax 呼び出しが実行されますが、dom は変更されず、再度移動するとすべて表示されます (引き続き ajax 呼び出しを実行します)。これは私のhtmlです:

<table>
<thead>
    <tr>
        <th>Name</th>
    </tr>
</thead>
<tbody data-bind="foreach: subjects">
    <tr>
        <td data-bind="text: Subject_Name"></td>
    </tr>
</tbody>
</table>

手がかりはありますが、私はデュランダルの使用に非常に慣れていませんが、dom を効果的に更新できないのではないかと心配しています。

4

1 に答える 1

6

あなたの問題は非常に似ていると思います: HotTowel: ビューモデルは、ページ間を移動するときにマッピングを失います

AJAX 呼び出しは非同期タスクであるため、バインドの適用に進む前に、データが取得されるまで待機するよう durandal に指示するために、 activate 関数で promise を返す必要があります。

于 2013-03-14T16:57:41.113 に答える