ui-router在状态更改之前呈现模板

时间:2014-12-15 14:23:48

标签: angularjs angular-ui-router

我有一个这样的嵌套状态结构:

$stateProvider
        .state('main', {
            url: '',
            abstract: true,
            templateUrl: ...
            controller: mainController,
            resolve: {
                Resolve1: ...
                Resolve2: ...
            }
        })
        .state('main.state1', {
            url: '^/state1/:id/',
            templateUrl: ....
            controller: state1Controller,
            resolve: {
                Resolve11: ...
                Resolve22: ...
            },
        })
        .state('main.state2', {
        ....

从我所看到的情况来看,当您处于州main.state1并且使用另一个id参数导航到相同的状态时,main.state1的模板会正常呈现,但是main(父级)在状态更改之前呈现(我猜它不等待main.state1的数据解析)。这导致视图使用错误的数据呈现(更具体地说,我用于生成链接的状态参数是错误的)。

我的mainController注入了$stateParams$state,这就是我从中获取数据的地方。

之前有没有人注意到这一点?这是设计还是错误?

有没有办法用最新数据更新父视图?

但是,我希望ui-router能够等待所有数据分辨率,直到它开始渲染视图(甚至是父视图)。我不知道我在这里遗漏了什么,但到目前为止,这是我对这个问题的理解......

更新

我现在看到视图渲染(带插值)中涉及的函数被多次调用,首先使用旧值,然后使用新值。但是我在屏幕上看到的最终结果是使用了我第一次进入'main。*'状态时使用的初始数据。这太奇怪了。

更新2:

我发现我的链接只在使用ui-sref时才更新(注意我在状态href中使用了参数,例如ui-sref =“main.state1({id:{{getId()}} })“)。当切换到ng-href时,一切都按预期工作。

我不知道为什么,但这解决了问题。

奇怪的是,ui-sref已被评估,但链接未更新。

去图......

更新3:

这种解决方案反过来又引发了其他问题。然后第一次点击重新加载应用程序......所以这不是最好的解决方案......

2 个答案:

答案 0 :(得分:1)

"解决方案"是将ng-click$state.go()一起使用,而不是使用链接。

这似乎是ui-router中的一个错误。

答案 1 :(得分:0)

ui-router过渡"通过"父母对孩子的状态。这意味着将触发main,然后是main.state1。我自己遇到了这个问题,我在那里获得了重复的侦听器和HTML DOM元素 - main实际上是在相同的时间运行main.state1。这种行为是设计使然,AFAIK唯一的选择是围绕它进行设计。