【问题标题】:ui-router: Parent's resolve not called when state changesui-router:状态更改时未调用父级解析
【发布时间】:2015-08-29 16:46:36
【问题描述】:

在 ui-router 中,当状态发生变化时,它应该调用其所有父级解析。这在第一次状态更改时起作用。但是对于 第二次 时间,父级的解析不会被调用(可能是因为它们之前已经解析过)。

这是状态配置

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 http://plnkr.co/edit/rMVbxErZyStt97JifJlj。打开开发控制台并单击按钮。您会看到 preloadData 仅在第一次状态更改时被调用。对于未来的状态变化,它不会被调用。

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

【问题讨论】:

    标签: javascript angularjs angular-ui-router


    【解决方案1】:

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

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

         A     B
        /     /
       AA    C
            / \
           C1 C2
    

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

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

    【讨论】:

    • 我认为唯一的方法是将所有的解析附加到它们自己的状态,或者你有其他想法?
    • @23tux,是的,如果它需要重新解析每个状态,这将是一个好方法。
    • 它在我的情况下不起作用:我有一个被拒绝的解决方案,因为我没有登录到某个状态。然后从外部状态我们登录并尝试进入第一个状态(层次结构之外),但它仍然被拒绝并且我的提供者没有被调用。有没有类似缓存之类的东西?
    • @FabienHenon,听起来像是一个不同的问题...发布一个新问题
    猜你喜欢
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    相关资源
    最近更新 更多