Angular UI-Router状态取决于另一个解析

时间:2015-06-19 10:13:16

标签: angularjs angular-ui-router

编辑:这实际上有效,问题来自于别的东西。

我正在努力解决边缘情况,基本上是:

$stateProvider.state('myState', {
  resolve:{
    resolveA:  function($q){
      return $q.when('whatever');
    },
    resolveB:  function(resolveA){
      return fetchSomethingBasedOn(resolveA);
    }
  }
);

这不起作用,因为resolveA无法在resolveB函数中注入。

我已经考虑了一些选项但拒绝了:

  1. 使resolveA返回的值为对象{resolveA, resolveB}。丢弃,因为这会对我现有的控制器产生许多副作用。
  2. 处理controller级别的resolveB行为。因为这个状态是一个抽象的高级别而被丢弃,我不想改变所有的孩子states/controllers

3 个答案:

答案 0 :(得分:2)

ui-router nested resolve不适用于同一个状态,但它应该适用于嵌套状态。您可以从父状态访问resolved个对象。

$stateProvider
.state('parent', {
  resolve:{
    resolveA:  function($q){
      return $q.when('whatever');
    }
  }
)
.state('parent.child', {
  resolve:{
    resolveB:  function(resolveA){
      return fetchSomethingBasedOn(resolveA);
    }
  }
);

答案 1 :(得分:-1)

似乎OK-ish的选项是将resolveB的结果附加到resolveA对象并且只有一个解析。即:

$stateProvider.state('myState', {
  resolve:{
    resolveA:  function($q){
      return $q.when('whatever').then(function(resolveA){
        return fetchSomethingBasedOnResolveA(resolveA).then(function(resolveB){
           resolveA.resolveB = resolveB;
           return resolveA;
        })
      });
    }
  }
);

答案 2 :(得分:-1)

您的问题的解决方案是使用promises。在开始使用resolveB之前,您必须确保解决了resolveA的承诺。

代码应该是这样的。

$stateProvider.state('myState', {
resolve:{
resolveA:  function($q){
  var def = $q.defer();
//whatever you want i.e.
  User.resource.get(function(perfil){
          def.resolve(perfil);
        });
//
  return def.promise;

},
resolveB:  function(resolveA){
  return fetchSomethingBasedOn(resolveA);
}});

这应该可以解决你的问题。

问候。