Javascript ui路由器:父';状态更改时未调用s resolve

Javascript ui路由器:父';状态更改时未调用s resolve,javascript,angularjs,angular-ui-router,Javascript,Angularjs,Angular Ui Router,在ui路由器中,当一个状态改变时,它应该调用它的所有父解析。这在状态第一次更改时起作用。但是第二次,没有调用父级的解析(可能是因为它们以前已经解析过) 这是状态配置 var app = angular.module('plunker', ['ui.router']); app.config(function($stateProvider) { $stateProvider .state('root', { abstract: true, resolve: {

在ui路由器中,当一个状态改变时,它应该调用它的所有父解析。这在状态第一次更改时起作用。但是第二次,没有调用父级的解析(可能是因为它们以前已经解析过)

这是状态配置

var app = angular.module('plunker', ['ui.router']);

app.config(function($stateProvider) {
  $stateProvider
  .state('root', {
    abstract: true,
    resolve: {
      preloadData: function() {
        console.log("preloadData");
        return true;
      }
    }
  })
  .state('root.home', {
    resolve: {
      test: function() {
        console.log('Home')
        return true;
      }
    }
  })
  .state('root.login', {
    resolve: {
      test: function() {
        console.log('Login')
        return true;
      }
    }
  });
});
这是plnkr。打开dev控制台并单击按钮。您可以看到,
preload data
仅在状态第一次更改时调用。对于将来的状态更改,不调用它

这种行为是有意的/正常的吗?有没有办法在每次状态更改时强制调用父级的Resolve?

当您从“外部”状态(即相关状态的层次结构树之外的状态)转到特定状态(或其后代之一)时,会运行该状态的“Resolve”。然后,其子体和自身之间的导航不会重新运行“resolves”和控制器

换句话说,给定以下状态层次结构示例:

     A     B
    /     /
   AA    C
        / \
       C1 C2
然后,从A切换到B将运行B的控制器并“解析”,因为A在B树之外。然后切换到C(或C1或C2),然后再切换回B,不会重新运行B的解析


如果您随后切换回A(或AA),则A将运行解析。

我认为唯一的方法是将所有解析附加到它们自己的状态,或者您有其他想法吗?@23tux,是的,如果需要对每个状态重新解析,这将是一个很好的方法。它在我的情况下不起作用:我有一个被拒绝的解决方案,因为我没有登录到某个状态。然后从外部状态登录并尝试转到第一个状态(层次结构之外),但它仍然被拒绝,并且没有调用我的提供者。有没有缓存之类的东西?@FabienHenon,听起来是另一个问题。。。发布一个新问题好的,我做到了: