我正在尝试为我的控制器解析多个服务,第二个服务首先依赖于第一个解析,因为它需要包含一些数据才能发出请求。
以下是我想要做的,以及我认为它应该如何工作,但是,我似乎无法访问第一个resolveData请求中返回的数据。
非常感谢任何建议或想法
.when('/maps/:id', {
templateUrl: 'partials/maps/view',
controller: 'MapViewCtrl',
authenticate: true,
resolve: {
resolveData: function ($route, MapService) {
var data = MapService.showfull({id: $route.current.params.id});
return data.$promise;
},
resolveMoreData: function($route, Service, resolveData){
var returnData = Service.get({id: resolveData.id});
return returnData.$promise;
}
}
})
答案 0 :(得分:1)
路由定义中解析的值不能相互依赖。它们旨在由控制器用于该路线。
请参阅$ routeProvider源代码的这一部分以获取参考:
function updateRoute() {
// ...
var locals = angular.extend({}, next.resolve);
angular.forEach(locals, function(value, key) {
locals[key] = angular.isString(value) ?
$injector.get(value) : $injector.invoke(value, null, null, key);
});
// ...
// Here, we use $q.all(), which converts array of the promises
// into a single promise. That input array contains independent
// promises.
return $q.all(locals);
}
您可以通过以下几种方式解决这个问题:
resolveMoreData
逻辑移至控制器第二个选项可能如下:
resolve: {
data: function ($route, MapService, Service) {
var deferred = $q.defer();
MapService
.showfull({id: $route.current.params.id})
.then(function success(data) {
return Service.get({id: data.id});
}, function error(reason) {
deferred.reject(reason);
})
.then(function success(data) {
deferred.resolve(data);
}, function error(reason) {
deferred.reject(reason);
});
return deferred.promise;
}
}
(注意上面的代码只是一个例子,我没有运行它。)