路由器中的Angular Multiple Resolve

时间:2014-08-20 20:34:29

标签: javascript angularjs router

我正在尝试为我的控制器解析多个服务,第二个服务首先依赖于第一个解析,因为它需要包含一些数据才能发出请求。

以下是我想要做的,以及我认为它应该如何工作,但是,我似乎无法访问第一个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;
        }
    }
  })

1 个答案:

答案 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逻辑移至控制器
  • 创建一个单独的依赖项(作为已解析的依赖项或服务),将这两个promises合并为一个。

第二个选项可能如下:

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

(注意上面的代码只是一个例子,我没有运行它。)

相关问题