Durandal KO Binding View Issue

У меня модель представления Durandal работает так:

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>

Любые подсказки, я очень новичок в использовании Durandal, но теперь беспокоюсь, что он не будет эффективно обновлять дом.


person user1166905    schedule 14.03.2013    source источник


Ответы (1)


Я думаю, что ваша проблема очень похожа на: HotTowel: Viewmodel теряет сопоставление при навигации между страницами

Вызов AJAX — это асинхронная задача, поэтому вам нужно вернуть обещание в функции активации, чтобы сообщить Durandal подождать, пока данные не будут получены, прежде чем приступить к применению привязок.

person Julián Yuste    schedule 14.03.2013
comment
отлично, я просто поставил return в начале моего вызова ajaxRequest, и теперь он всегда там, спасибо. - person user1166905; 14.03.2013