【问题标题】:How to differentiate between browser back button and $state.go (dynamic params)?如何区分浏览器后退按钮和 $state.go(动态参数)?
【发布时间】:2017-10-31 14:34:42
【问题描述】:

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

在 UI-Router v1.x 之前,我曾经将{ notify: false }$stateChangeSuccess 事件结合使用来处理这类事情。但是现在dynamic params 是要走的路,我不知道如何再做这项工作。

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

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

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

谢谢。

【问题讨论】:

    标签: angularjs angular-ui-router back


    【解决方案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
      } 
    });
    

    【讨论】:

      猜你喜欢
      • 2016-01-22
      • 1970-01-01
      • 2011-01-08
      • 2017-06-29
      • 2010-09-14
      • 2013-03-02
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      相关资源
      最近更新 更多