任何人都可以用ui-router和后退按钮解释意外的状态转换?

时间:2014-11-27 01:19:18

标签: angularjs angular-ui-router

我使用带有嵌套状态/视图的ui-router,并且我的后退按钮出现问题。

州级别

  • 产物
    • 个人
      • 子CAT-1
      • 子CAT-2
    • 业务
      • 子的小猫一个
      • 子猫-B
  • 搜索

问题

我最初在状态product.business.sub-cat-a中加载页面。顶级页面有一个搜索输入表单,当使用该表单时,会导致状态转换到状态search(通过调用$state.go()),这一切都正常。

但是,如果我点击后退按钮,我会看到状态从search过渡到product.business.sub-cat-a按预期(通过调用$state.transitionTo()),但是还有另外一个致电$state.go()返回状态search,我无法确定此来电的来源。

如果有人能够了解ui-router正在做什么,那么会感激一些帮助

更新

我已将此问题追溯到urlRouter$location之间的互动。似乎$urlRouter.update有时会将统计信息中定义的网址推送到$location,有时会将值从$location中提取出来。

在这种情况下,当出现问题时,urlRouter位置值是旧的URL,它覆盖$location.url值并导致urlRouter加载旧状态而不是状态我们正试图回去。

序列似乎是:

  1. 点击后退按钮
  2. 浏览器从其历史记录中加载上一个网址
  3. ui-router开始加载正确的状态(以前的状态)
  4. urlRouter上调用更新(没有读取参数),这会导致$location根据urlRouter位置值重置为前后按钮状态URL
  5. urlRouter然后将两个网址/状态视为不同,以便重新加载现在由$location.url指定的状态,这是前回按钮网址
  6. 所以问题似乎是在上面的步骤3中更新状态时urlRouter位置值没有更新。

    任何ui-router / angular专家,请随时指出我正确的方向。

1 个答案:

答案 0 :(得分:1)

对于任何遇到类似问题的人来说,问题在于当按下后退按钮时,会触发两个状态转换。第一个是后退按钮产生的正确;第二个是与父(业务)状态相关联的$ state.go(),如上面的层次结构所示。

resolve步骤生成的承诺得到解决之前,处理了第二个转换。这意味着urlRouter位置在随后的$urlRoute.udpate()调用之前尚未更新,因此路由器重新加载了原始页面。

希望这可能有助于节省其他人一天的调试: - )