У меня есть следующие в моей папке ViewModel:Как бороться с вызовами async ajax в методе активации durandal?
var observableData = ko.observable();
function activate(routeData) {
var buildObservableData = function (data) {
observableData(ko.mapping.fromJS(data, mapping));
// do stuff here that I need server data for
}
return dataservice.getFolder(currentFolderId, buildObservableData);
}
С GetFolder как:
var getFolder = function (id, buildData) {
var request = $.ajax({
async: true,
url: endpoint,
type: 'GET',
dataType: 'json',
xhrFields: {
withCredentials: true
},
})
.done(function (data) {
buildData(data);
})
.fail(function (msg) {
toastr.error("Error: Could not load folder data.");
});
}
Теперь, на мой взгляд, папки, у меня есть:
<!-- ko foreach: data().folders -->
<!-- /ko -->
Так что, когда я перейдите из одной папки в другую, я получаю это:
"Unable to parse bindings.↵Message: TypeError: Cannot read property 'folders' of undefined;↵Bindings value: foreach: data().folders "
Что я делаю неправильно?
Update:
Если изменить АЯКС вызов к этому:
return $.ajax({
из этого:
var request = $.ajax({
тогда я могу перемещаться по моим взглядам ... но я Не уверен, что это правильно. Я оставлю это на случай, если это поможет кому-то другому, или если это не так.
Решение, которое вы нашли, - это решение из книги http://durandaljs.com/documentation/View-Model/, так что это правильно. > Возможно, вы можете вернуть обещание сообщить активатору, когда логика активации асинхронизации завершена. BTW: Вы можете ответить на свой вопрос и пометить его как решение. Не то, чтобы вы получили хоть какую-то репутацию, но это помогает закрывать вопросы. – RainerAtSpirit
@RainerAtSpirit Спасибо! – SB2055
Довольно поздно, но не хотите ли вы вернуть обещание AJAX, а затем в вашем активировании есть сделанный метод, который бы добавил данные? Мне кажется, у тебя все в порядке. Это в конечном итоге работает на вас? – rball