如何区分浏览器后退按钮和$ state.go(动态参数)?

时间:2017-10-31 14:34:43

标签: angularjs angular-ui-router back

我需要在某些情况下(通过代码)简单地更新URL参数,而不是触发任何事件。但是,如果用户使用浏览器后退按钮返回或者他手动更改了url参数,我仍然需要触发某些操作。

在UI-Router v1.x之前,我过去常常将{ notify: false }$stateChangeSuccess事件结合使用。但是现在dynamic params是要走的路,我无法弄清楚如何让这项工作再进行。

我已将路由的所有参数定义为动态,当我执行$state.go(".", params)时,控制器不会刷新。这是预期的。然而,$transition.onSuccess确实仍然发现我发现有点奇怪,我不希望在这种情况下发生此事件。

当我使用后退按钮向后移动时,或者如果我手动更改参数时,会发生同样的事情。控制器不会刷新,$transition.onSuccess会触发。

我的主要问题是如何知道一个事件来自用户,而另一个事件来自代码?我在这里错过了什么?我检查了onSuccess回调的转换参数,但找不到任何可以帮助我的东西。我应该使用不同的事件/钩子,或者使用最新的UI路由器,这是不可能的?

日Thnx。

1 个答案:

答案 0 :(得分:1)

似乎我找到了一种方法来找出过渡的来源。如果有人有不同的/更好的解决方案,请发布它,我发现这不是最好的解决方案,但它有效并且考虑到我找不到更好的解决方案,我会坚持下去,直到有人告诉我更好的方法

 // The "to:" ensures the event doesn't trigger for other routes
 this.$transitions.onSuccess({ to: "your.route" }, (trans) => {
  let changedParams = trans._changedParams();
  if (trans._options.source === "url" &&                  // transition came from URL change
      changedParams && changedParams.length > 0) {        // at least one param changed
    // do something
  } 
});