【问题标题】:How to stop execution of Controller with $routeChangeStart in angularjs如何在 angularjs 中使用 $routeChangeStart 停止控制器的执行
【发布时间】:2014-10-05 09:36:31
【问题描述】:

我在登录时设置会话,然后在重置会话时阻止调用 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'
      });

【问题讨论】:

  • 你可以在定义route参数时添加resolve属性和promise,并在需要时拒绝promise。 $routeChangeError 将被解雇。

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


【解决方案1】:

经过一番更艰苦的谷歌搜索后,我找到了this url 它告诉我应该使用$locationChangeStart 它有能力立即停止执行,我重定向回我的预期路线。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      • 2016-05-13
      • 1970-01-01
      • 2013-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多