【问题标题】:ui-router Inherited Resolved Dependenciesui-router Inherited Resolved Dependencies
【发布时间】:2016-07-24 02:43:40
【问题描述】:

我试图用抽象状态实现一个安全区域,然后由具体状态实现。

根据this blog post,我认为我可以让抽象状态解析身份验证并让具体状态依赖它,因为如 ui-router 文档中所述

子状态将从父状态继承已解析的依赖项

但后来,同一个 ui-router 文档提到了这一点

如果您想在实例化子节点之前等待 promise 被解析,则必须将解析键注入子状态。

事实上,如果我在具体状态上注释掉resolveline,它就不再起作用了。

所以我真的错过了一些东西。 如果 ChildState 继承已解析的依赖项,为什么要重新注入它们?

我的代码如下:

router.config(function($stateProvider, $urlRouterProvider) {

    var authentication = ["Auth", function(Auth) {

                    return Auth.$requireAuth();
                }];

    .state('secure', {
            abstract: true,
            template: '<navbar></navbar><ui-view/>',
            resolve: authentication


        })

        .state('secure.concrete', {
            url: '/concrete',
            templateUrl: 'views/concrete.html',
            controller: 'concreteCtrl',
            resolve: authentication  // <--- if i comment this out, it wont work
        })

更新:

经过几个小时的眼泪,看来我走错了路。问题不是来自继承的已解决依赖项,而是来自这样一个事实,即一旦解决了承诺,它就不会“重置”。

是否有强制承诺在每次状态变化时重新设置/重新评估?

【问题讨论】:

  • 为什么要用什么来重新做什么?对每个状态变化重新评估什么?
  • 我想这意味着我的问题无法理解,对此我深表歉意,但如果您肯定明白您的评论是不可回复的。如果您想进一步帮助我,欢迎您,但不清楚的地方请详细说明...
  • 不错!显然,我添加了一个同样模糊的评论。对此感到抱歉。我认为我感到困惑的要点是问题的实质(例如"If ChildState inherit resolved dependencies, why should they be re-injected?""Is there anyway to force the promise to be re-setted / re-evaluated on each state change?")。我们是在谈论过期的令牌还是打电话给unauth(),然后不再重新评估承诺? this look like it may help 吗?如果是这样,我可以详细说明。
  • 天哪,就是这样!谢谢链接!我需要更深入地研究它!目前,我通过为任何状态更改设置 {reload: true} 选项来解决问题。但我真的很想了解地面概念。我保留票打开,您的任何评论将不胜感激!
  • 状态变化是指ui-router的$state变化(例如$state.go()...)

标签: angularjs firebase angular-ui-router promise


【解决方案1】:

这对我有用,但我不确定为什么:

我没有正常调用 state.go() 或 ui-sref,而是使用 state.go(state, {reload:true}) 或

调用它们

这样看来,决心似乎被重新评估了。

【讨论】:

    【解决方案2】:

    问题可能是resolve语法不正确,它应该是一个对象:

    resolve: {
      authentication: authentication
    }
    

    “必须注入子状态”意味着authentication 应明确声明为子状态控制器依赖项。在子状态上重复 resolve 不是注入;它只会让authentication 被调用两次。

    【讨论】:

    • 使用对象更改 resolve 语法没有帮助。结果相同。
    • 但这让我觉得我没有在任何控制器中注入承诺......承诺最终会触发一个 ChangeStateError 事件,由 $rootScope.$on 捕获,然后 event.preventDefault() 并重定向$state.go().
    • 你认为承诺应该注入控制器吗?
    • @Developpeurtunisie 是的,它应该注入到控制器中,例如。 authentication 也可以注入到其他状态部分(孩子的templateProvider 或自己的解析器),这就是引用的手册摘录所指的“注入到子状态”而不仅仅是“注入到孩子的控制器”。
    • 所以它应该被注入到每个具体状态的控制器中“扩展”抽象的控制器?
    猜你喜欢
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    相关资源
    最近更新 更多