2013-07-08 78 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({ 

那么我就可以浏览在我的意见......但我不知道这是正确的。如果它帮助别人或者万一不合适,我会留下来。