2013-07-08 75 views
0

我在我的文件夾視圖模型如下:如何處理durandal激活方法中的異步ajax調用?

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 " 

我在做什麼錯?

更新:

如果我改變AJAX調用此:

return $.ajax({ 

從這個:

var request = $.ajax({ 

那麼我就可以瀏覽在我的意見......但我我不確定這是否正確。如果它幫助別人或者萬一不合適,我會留下來。

+1

您發現的解決方案是書中http://durandaljs.com/documentation/View-Model/解決方案中的一個,因此它是正確的。 >您可以選擇返回承諾,以在異步激活邏輯完成時通知激活器。 順便說一句:您可以回答自己的問題,並將其標記爲解決方案。並不是說你會得到任何聲望,但它有助於解決問題。 – RainerAtSpirit

+0

@RainerAtSpirit謝謝! – SB2055

+0

姍姍來遲,但是你不想要返回AJAX諾言,然後在激活中有一個完成的方法來添加數據?在我看來,你已經把所有的東西都倒退了。這最終會爲你工作嗎? – rball

回答

1

如果我改變AJAX調用此:

return $.ajax({ 

從這個:

var request = $.ajax({ 

那麼我就可以瀏覽在我的意見......但我不知道這是正確的。如果它幫助別人或者萬一不合適,我會留下來。