Angularjs 角度UI路由器状态解析取决于另一个解析

Angularjs 角度UI路由器状态解析取决于另一个解析,angularjs,angular-ui-router,Angularjs,Angular Ui Router,编辑:这实际上是可行的,问题来自其他方面 我正在努力解决一个边缘案例场景,基本上: $stateProvider.state('myState', { resolve:{ resolveA: function($q){ return $q.when('whatever'); }, resolveB: function(resolveA){ return fetchSomethingBasedOn(resolveA); } } )

编辑:这实际上是可行的,问题来自其他方面

我正在努力解决一个边缘案例场景,基本上:

$stateProvider.state('myState', {
  resolve:{
    resolveA:  function($q){
      return $q.when('whatever');
    },
    resolveB:  function(resolveA){
      return fetchSomethingBasedOn(resolveA);
    }
  }
);
这不起作用,因为无法在
resolveB
函数中插入
resolveA

我已经考虑过但拒绝了以下几个选项:

  • 将resolveA返回值设置为对象
    {resolveA,resolveB}
    。已放弃,因为这将对我现有的控制器产生许多副作用
  • 控制器
    级别处理resolveB行为。丢弃,因为此状态是抽象的高级状态,我不想更改其所有子级
    状态/控制器

  • 看起来不错的选项是将resolveB的结果附加到resolveA对象,并且只有一个resolve。i、 e:

    $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;
            })
          });
        }
      }
    );
    
    不能在同一状态下工作,但应该在嵌套状态下工作。您可以从父状态访问已解析的对象

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

    解决你的问题的方法是使用承诺。在开始使用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);
    }});
    
    这应该能解决你的问题


    问候。

    事实上,这应该行得通。你可以做你想做的事,你必须确保你的决心会回报你的承诺。我试过了,但从来没有成功过。你能提供一个有效的例子吗?这很奇怪。我会继续努力的,我知道了。我试图注入一个名称拼写错误的服务。。。我真丢脸。