2015-11-06 35 views
1

我在與解決一個模態控制器多個參數如這樣的麻煩:AngularJs控制器解決依賴

controller : 'MyController', 
controllerAs : 'vm', 
resolve  : { 
    resolveInfo : function(REST){ 
    var resolveInfo = {} 
    return REST.doGet('/things/').then(
     function(thingsResponse){ 
     resolveInfo.things = thingsResponse.data; 
     return REST.doGet('/stuff1/' + '/mystuff/' + resolveInfo.things[0].id).then(
      function(stuff1Response){ 
      resolveInfo.stuff1 = stuff1Response.data; 
      return REST.doGet('/stuff2/' + '/mystuff/' + resolveInfo.stuff1[0] + '/' + resolveInfo.things[0].id).then(
       function(stuff2Response){ 
       resolveInfo.stuff2 = stuff2Response.data; 
       return resolveInfo; 
       } 
      ); 
      } 
     );  
     } 
    ) 
    } 

然後在「myController的」我拿出從resolveInfo這三個對象。 但我希望像這樣的工作:

controller : 'MyController', 
controllerAs : 'vm', 
resolve  : { 
    things : function(REST){ 
    return REST.doGet('/things/').then(
     function(thingsResponse){ 
     return thingsResponse.data; 
     } 
    ) 
    }, 
    stuff1 : function(REST, things){ 
    return REST.doGet('/stuff1/' + '/mystuff/' + things[0].id).then(
     function(stuff1Response){ 
     return stuff1Response.data 
     } 
    ); 
    }, 
    stuff2 : function(REST, stuff1, things){ 
    return REST.doGet('/stuff2/' + '/mystuff/' + stuff1[0] + '/' + things[0].id).then(
     function(stuff2Response){ 
     return stuff2Response.data; 
     } 
    ); 
    } 

但這罵未知提供商「東西」

有沒有辦法來實現這一目標?

+1

您需要使用$ q.all()...它會在繼續之前等待所有資源。 –

回答

1

當使用ngRoute或UI路由器時,resolve參數應該立即返回它的值或返回一個承諾。你的代碼的問題是,你正在等待承諾結束之前返回一個值,這將無法正確解決。

的Javascript路線

下面是更新的路由代碼,返回的承諾。

controller : 'MyController', 
controllerAs : 'vm', 
resolve  : { 
    things : function(REST){ 
    return REST.doGet('/things/'); 
    }, 
    stuff1 : function(REST, things){ 
    return REST.doGet('/stuff1/' + '/mystuff/' + things[0].id); 
    }, 
    stuff2 : function(REST, stuff1, things){ 
    return REST.doGet('/stuff2/' + '/mystuff/' + stuff1[0] + '/' + things[0].id); 
    } 
} 

的Javascript控制器

這裏是一個示例控制器然後,可以使用已解決的參數。

.controller('MyController', function(things, stuff1, stuff2) {}) 
+0

這就是我一直在尋找的,我不知道解決的數據或承諾。所以我需要將'things [0] .id'改成'things.data [0] .id'或在'things:function(REST)'中使用'$ q'來返回一個帶有處理事物數據的新promise 。 – Illiax

1

當您想等待多個承諾時,您可以使用$q.all([promise1, promise2, ...]),但是您希望使用先前承諾的結果。

一個基本的重組可以解決你的問題:

function resolveInfo(REST) { 
    function getThings() { 
     return REST.doGet('/things/').then(
      function (resp) { 
       return getStuff1(resp.data); 
      }); 
    } 

    function getStuff1(things) { 
     return REST.doGet('/stuff1/mystuff/' + things[0].id).then(
      function (resp) { 
       return getStuff2(things, resp.data); 
      }); 
    } 

    function getStuff2(things, stuff1) { 
     return REST.doGet('/stuff2/mystuff/' + stuff1[0] + '/' + things[0].id); 
    } 

    return getThings(); 
} 

所以,你在鏈接的承諾承諾處理then承諾返回。這裏有一個關於這個主題的正確文檔:http://solutionoptimist.com/2013/12/27/javascript-promise-chains-2/