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