如何在angularjs中使用$ routeChangeStart停止执行Controller

时间:2014-08-12 10:39:39

标签: angularjs angularjs-scope angularjs-service angularjs-routing

我在登录时设置会话,之后我阻止调用LoginCtrl,因为它正在重置会话。 我有一个路由设置,如果有任何未定义的路由被调用它需要/login但是要在登录时避免这种情况我使用以下代码重定向,这似乎无法正常工作

我也在使用event.preventDefault();但没有用。 LoginCtrl是不可阻挡的,无论$location.path()被更改为其他控制器,它仍然被执行。

app.run(['$rootScope', '$location', 'SessionService', function ($rootScope, $location, sessionService) {
    $rootScope.$on('$routeChangeStart', function (event, next) {
//      if((next.redirectTo == '/login' || next.originalPath == '/login') && sessionService.isLogin()){
      if((next.templateUrl == 'views/login.html') && sessionService.isLogin()){
          event.preventDefault();
          $location.path('/settings/resetpassword');
          return;
        }

    });
}]);

以下是LoginCtrl。

angular.module('myApp')
.controller('LoginCtrl', function ($scope, $location, loginService, SessionService, ShowApiErrors) {
    $scope.init = function () {
      SessionService.resetMySession();
    };
    $scope.init();

});

路由器: -

$routeProvider
      .when('/', {
        redirectTo: '/login'
     })
    ....
     .otherwise({
        redirectTo: '/login'
      });

2 个答案:

答案 0 :(得分:2)

经过一些更加努力的谷歌搜索后,我发现this url它告诉我应该使用$locationChangeStart 它能够立即停止执行,然后重定向回到我想要的路线。

$rootScope.$on('$locationChangeStart', function (event, next) {
      if(next.match('/login') && sessionService.isLogin()){
        $location.path('/after-login-path');
      }
    });

答案 1 :(得分:0)

在LoginCtrl下,为什么在注销之前不检查用户是否已登录。或任何其他阻止用户注销的情况。据我所知,你不能阻止控制器执行。

angular.module('myApp')
.controller('LoginCtrl', function ($scope, $location, loginService, SessionService, ShowApiErrors) {
    $scope.init = function () {
          if(!SessionService.isLogin()) {
               SessionService.resetMySession();
          }
    };
    $scope.init();

});