2

我有一个模块的运行函数,里面有一个$routeChangeStart事件绑定。我想知道触发第一个 routeChangeStart 事件的时间。我期望它应该在第一次请求之后但在任何页面呈现之前立即调用,但它不是我预期的那样。似乎在页面开始呈现后调用了该事件。

  module.run(function ($location, $rootScope) {
      $rootScope.$on("$routeChangeStart", function (event, next, current) {
         //do something with next.xxx
      });
   })

预期的行为是什么?或者这是一个错误?

4

1 回答 1

0

该事件在页面开始渲染之前触发,但这并不意味着您会在渲染开始之前捕获它。该事件被触发,然后调用堆栈中的下一件事是 Angular 开始页面渲染(获取模板,等待路由解析属性等),然后您捕获该事件。从角度文档...

在路线更改之前广播。此时,路由服务开始解决发生路由更改所需的所有依赖项。通常这涉及获取视图模板以及在解析路由属性中定义的任何依赖项。一旦解决了所有依赖项,就会触发 $routeChangeSuccess。

如果您需要执行诸如有条件地阻止更改之类的操作,请尝试改用$locationChangeStart事件。例如...

$scope.$on('$locationChangeStart', function (event) {
    if (someCondition) {
       event.preventDefault(); // prevent the change
    }
});

这将在 Angular 开始加载新页面之前运行。

于 2014-06-25T02:36:57.633 回答