在$ stateChangeStart中使用$ state.go时,ui-router中的双状态更改

时间:2015-10-26 12:31:37

标签: javascript angularjs angular-ui-router

这是我的plunker。如果单击profile链接并查看生成的状态更改列表:

stateChanges = [
  " -> home",
  "home -> profile",
  "home -> signIn",
  "signIn -> signIn"
]

你可以看到意外的额外状态变化"signIn -> signIn"

我做了一些调试,似乎是ui-router通过$locationChangeSuccess函数对afterLocationChange的反应。但我不确定这是否是ui-router中的错误,或者是我如何配置ui-router以及如何管理重定向的结果。如果行为是我的错,我该如何解决?

我非常感谢帮助,因为双状态更改导致我的查询参数被双重URL编码:/profile -> %2Fprofile -> %252Fprofile而不是前两个。

更新

这似乎是0.2.15附带的东西。我尝试使用旧版本甚至0.2.14工作正常。经过一番调查后,我发现问题来自于提交48aeaff。如果我取消注释该提交注释掉的代码,即使在0.2.15上,这个问题也会消失。现在我将使用0.2.15的修改版本。

我还发现ui-router的问题跟踪器存在此问题#1573

2 个答案:

答案 0 :(得分:0)

kk看起来问题出在您在$stateProvider

中添加的查询字符串中

plunkr Demo

    .state("signIn", {
        parent: "frontpage",
        url: "/signIn?returnTo", // <--- remove the ?returnTo
        authorized: false,
        views: {
            "main@frontpage": {
                template: "sign in page"
            }
        }
    })

如果将其更改为/signIn,则应该没问题。您可能无法将?queryStrings放入stateProvider分配中。

        url: "/signIn" // It should work fine

答案 1 :(得分:0)

当我查看你的代码时,我找到了这个块:

else if (authorized === true)
        {
            if (!service.authentication.authorized) {
                $state.go("signIn", {
                    returnTo: toState.url
                });
            }
        }

当您实际从主页点击时 - &gt;配置文件,您将观察到authorized = true和service.authentication.authorized = false。因此,您要求浏览器导航到signIn状态。但是,您已经点击了“个人资料”,并且您将浏览器恢复到与之相同的状态。

我从上面的块中删除了event.preventDefault();语句,现在看起来工作正常。