2016-02-12 24 views
0

我正在尝试使用Resolve进行更抽象的操作,但无法获得输出结果。看起来我错过了一些东西。AngularJS UI-Router Resolve集合

问题:我需要在加载视图之前加载查找表数据。所以,我在ui-router中使用了resolve,这对每次查找都很有帮助。我认为最好是将查找集合成单个对象,但它的失败。这是代码。

不工作的代码:

resolve: {              
          lookups: ['GenericFactory', function(genericFactory) { 
           return { 
            StateList: genericFactory.GetStateList().then(function(response){return response.data;}), 
            EmployeeTypeList: genericFactory.GetEmployeeType().then(function(response){return response.data;}) 
           } 
          }] 
    } 

工作代码:

resolve: {              
          StateList: ['GenericFactory', function(genericFactory) { 
           return genericFactory.GetStateList() 
          }], 
          EmployeeTypeList: ['GenericFactory', function(genericFactory) { 
           return genericFactory.GetEmployeeType() 
          }] 
    } 

回答

2

docs

依赖性的可选地图应当注入到控制器。如果这些依赖关系中有任何一个是承诺,那么路由器将等待它们全部在控制器实例化之前被解析。

我会说你不能让非工作代码工作,因为你正在尝试返回一个对象。由于该对象本身不是承诺,因此上述规则不适用。

也许这将工作 - 你可以火起来的这些要求,在它自己的承诺将它们包装和返回(未经测试):

lookups: ['$q', 'GenericFactory', function($q, genericFactory) { 
    var deferred = $q.defer(); 

    var q1 = genericFactory.GetStateList().then(function(response){return response.data;}), 
    var q2 = genericFactory.GetEmployeeType().then(function(response){return response.data;}) 

    $q.all([q1, q2]).then(function (res) { 
     var obj = { 
      StateList = res[0]; 
      EmployeeTypeList = res[1]; 
     } 

     deferred.resolve(obj); 
    }); 

    return deferred.promise; 
}]