AngularJs控制器解析依赖关系

时间:2015-11-06 16:16:27

标签: javascript 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;
      }
    );
  }

但是这会在未知的提供者面前大喊“

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:1)

使用ngRoute或ui-router时,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) {})