2013-07-08 3 views
0

У меня есть следующие в моей папке 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({ 

тогда я могу перемещаться по моим взглядам ... но я Не уверен, что это правильно. Я оставлю это на случай, если это поможет кому-то другому, или если это не так.

+1

Решение, которое вы нашли, - это решение из книги http://durandaljs.com/documentation/View-Model/, так что это правильно. > Возможно, вы можете вернуть обещание сообщить активатору, когда логика активации асинхронизации завершена. BTW: Вы можете ответить на свой вопрос и пометить его как решение. Не то, чтобы вы получили хоть какую-то репутацию, но это помогает закрывать вопросы. – RainerAtSpirit

+0

@RainerAtSpirit Спасибо! – SB2055

+0

Довольно поздно, но не хотите ли вы вернуть обещание AJAX, а затем в вашем активировании есть сделанный метод, который бы добавил данные? Мне кажется, у тебя все в порядке. Это в конечном итоге работает на вас? – rball

ответ

1

Если изменить АЯКС вызов к этому:

return $.ajax({ 

из этого:

var request = $.ajax({ 

тогда я могу перемещаться по моим взглядам ... но я не уверен, если это правильно , Я оставлю это на случай, если это поможет кому-то другому, или если это не так.

Смежные вопросы