使用路由提供程序,在解析中返回$ promise将避免在加载UI后弹出数据。但是,我在处理两个不同的资源调用并将其作为单个数组返回时遇到问题。
当前的实现有效,但要求控制器需要两个资源。
var app = angular.module('app', []);
app.config(function($routeProvider) {
$routeProvider
.when('/resource/:id', {
templateUrl: 'partials/resource.html',
controller: ResourceController,
resolve: {
parentResource: function($route, SingleResource) {
return SingleResource.get({ id: $route.current.params.id }).$promise;
},
childResources: function($route, ChildResource) {
return ChildResource.get({ id: $route.current.params.id }).$promise;
}
}
});
});
但是,我要做的是为ResourceController
提供一个数组Resource
,该数组是由parentResource
和childResource
组成的数组,其中第0项在数组中是parentResource
。
这就是我的想法,但我不知道该如何回归?如果我返回结果,路径将改变并传递一个空数组。
var app = angular.module('app', []);
app.config(function($routeProvider) {
$routeProvider
.when('/resource/:id', {
templateUrl: 'partials/resource.html',
controller: ResourceController,
resolve: {
Resource: function($route, SingleResource) {
var resources = [];
SingleResource.get({ id: $route.current.params.id })
.$promise.then(function(parent)
{ resources.splice(0, 0, parent); })
.catch(function(error) { alert('error!'); })
ChildResource.get({ id: $route.current.params.id })
.$promise.then(function(children)
{ resources = resources .concat(children); })
.catch(function(error) { alert('error!'); })
return ???? // Can I return a $promise here?
}
}
});
});
如何从中获取ResourceController签名 然后我们的想法是让控制器拥有这个签名:
var ResourceController = function($scope, parentResource, childResources) { ... }
到
var ResourceController = function($scope, resources) { ... }
通过返回$ promise?
答案 0 :(得分:4)
您可以使用$ q.all返回承诺数组
var resources = [];
resources.push(SingleResource.get({ id: $route.current.params.id }).$promise);
resources.push(ChildResource.get({ id: $route.current.params.id }).$promise);
return $q.all(resources) // You return an array of promises
答案 1 :(得分:-1)
尝试使用
resolve: {
parentResource: function($route, SingleResource) {
return SingleResource.get({ id: $route.current.params.id }).$promise;
},
childResources: function($route, ChildResource, parentResource) {
return (parentResource.length > 0) ? ChildResource.get({ id: $route.current.params.id }).$promise : [];
}
}