簡體   English   中英

AngularJs控制器解析依賴

[英]AngularJs controller resolve dependency

使用這種方式在模態控制器中解析多個參數時遇到麻煩,例如:

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;
      }
    );
  }

但這讓不知名的提供者大喊“事情”

有沒有辦法做到這一點?

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

基本的重組可以解決您的問題:

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();
}

因此,您將在promise處理程序中返回promise, then將其鏈接到promise。 以下是有關此主題的適當文檔: http : //solutionoptimist.com/2013/12/27/javascript-promise-chains-2/

使用ngRoute或ui-router時, resolve參數應立即返回其值或返回Promise。 代碼的問題在於,您在等待諾言結束之前,要返回一個值,該值將無法正確解析。

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) {})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM