javascript - 为什么 event.preventDefault() 无法取消 Angular js 中的 $routeChangeStart 事件

标签 javascript angularjs

我已经在 Angular JS 应用程序中完成了路由限制。当用户已经登录时,它不应移动到登录页面。这是我的代码:

.run(function($rootScope, $location, Auth) {
    $rootScope.$on('$routeChangeStart', function(event, next) {

       Auth.isLoggedInAsync(function(loggedIn) {

        if(loggedIn){ //when user loged in it should not move to login page
          if ($location.path() == "/participant/login"){
            event.preventDefault();
          }
        }
      });
    });

这段代码不会给出任何类型的错误。但是当用户已经登录时它会移动到登录页面。我认为这里 event.preventDefault() 不起作用。如果我犯了任何错误或者如果你有什么好的办法来处理这个问题吗?

最佳答案

我认为 @wiherek 的答案一般不会起作用,因为它没有提供任何方法来保证 Auth 服务在 $routeChangeStart 处理程序被调用。

不过,您可以信赖的是,如果路由的 resolve 参数中的任何项目返回 Promise,那么:

  • promise 将在路线更改发生之前得到解决,或者
  • promise 将在 $rootScope.$routeChangeStart 广播之前被拒绝。

因此,在您的路线定义中,您可以这样:

$routeProvider.when('/participant/login', {
  resolve: {
    auth: function(Auth, $q) {
      var deferred = $q.defer();
      Auth.isLoggedInAsync(function(loggedIn) {
        if (loggedIn) {
          deferred.resolve();
        }
        else {
          deferred.reject({alreadyLoggedIn: true});
        }
      }).catch(function() {
        deferred.reject();
      });
      return deferred.promise;
    }
  }
);

你可以通过监听$routeChangeError来捕获它:

app.run(function($rootScope, $location, Auth) {
  $rootScope.$on("$routeChangeError", function(event, current, previous, rejection) {
    if (rejection != null && rejection.alreadyLoggedIn) {
      // We should get here if and only if
      // `deferred.reject({alreadyLoggedIn: true})` was called from the
      // above.
    }
  });
});

关于javascript - 为什么 event.preventDefault() 无法取消 Angular js 中的 $routeChangeStart 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25941848/

相关文章:

javascript - 使用jQuery从数据库中的特定时间段交替显示文本

JavaScript fullCalendar 插件读取 'applyAll' 在 gcal.js 中未定义

javascript - 为什么我的 Angular 不能正常工作?

javascript - 结合 JS 框架

AngularJS 指令在数据之前加载

javascript - select2 容器小于下拉列表

javascript freemarker springmvc spring.ftl

javascript - 为什么这个微任务在事件循环中先于宏任务执行?

JavaScript 字数统计表单验证

javascript - Generator-Angular-FullStack 无法添加 Angular-Chart.js