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

How to differentiate between browser back button and $state.go (dynamic params)?

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

在 UI-Router v1.x 之前,我曾经将 { notify: false }$stateChangeSuccess 事件结合使用来处理此类事件。但是现在 dynamic params 是要走的路,我无法再弄清楚如何使它起作用。

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

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

我的主要问题是如何知道一个事件来自用户,而另一个事件来自代码?我在这里错过了什么?我检查了 onSuccess 回调的转换参数,但找不到任何对我有帮助的东西。是否有不同的 event/hook 我应该使用,或者这对于最新的 UI-Router 来说根本不可能了?

谢谢。

看来我找到了一种方法来找出转换的来源。如果有人有 different/better 解决方案,请 post 它,我认为这不是有史以来最简洁的解决方案,但它有效并且考虑到我找不到更好的解决方案,我会坚持下去直到有人告诉我更好的方法。

 // 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
  } 
});