AngularJS UI-Router解析集合

时间:2016-02-12 05:07:34

标签: angularjs angular-ui-router angular-promise

我正在尝试使用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()
                            }]
     }

1 个答案:

答案 0 :(得分:2)

来自docs

  

应该注入控制器的可选依赖关系图。如果这些依赖项中的任何一个是promise,路由器将在实例化控制器之前等待它们全部解析。

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

也许这会起作用 - 您可以启动这些请求,将它们包装在自己的承诺中并返回(尚未经过测试):

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