阻止$ state重新加载

我正在使用Angular 1.3和Angular UI路由器,并希望在加载页面之前检查用户身份验证。

出于某种原因,如果返回$q.reject() ,则无论如何将重新加载页面(我可以看到它重新加载,并查看httpInterceptors请求)。

我不希望重新加载页面。 如果返回$q.reject ,它应该简单地在URL栏中回到home状态。

但是,每次返回拒绝时,它都会开始加载下一页,然后重定向。 我怎样才能防止页面重新加载?

代码

a)解析用户配置文件,然后测试他们的访问权限

.state('user.agent-admin', {
  url: '/agent-admin',
  templateUrl: 'views/users/agent-admin.tpl.html',
  controller: 'userAgentAdminCtrl',
  resolve: {
    ProfileLoaded : ['$rootScope', function ($rootScope) {
      return $rootScope.loadProfile();
    }],
    access: ['Access', 'ProfileLoaded', function (Access, ProfileLoaded) {
      // could be true or $q.reject(); 
      return Access.hasORRoles(['admin']);
    }]
  }
});

b)负载曲线

 $rootScope.loadProfile = function () {
   if (Session) {
     return $q.when(Session);
   } else {
     return User.getProfile().then(function (res) {
       ... // set session to user then return
       return $q.when(Session);
     });
   }
 };

c)在$q.reject() ,这不应该重新加载页面,在更改URL状态时返回到原来的状态并阻止加载页面。

 $rootScope.$on('$stateChangeError', function (event, toState, toParams, fromState, fromParams, error) {
   if (error === 400) {
     $state.go('user.home');
   }
 });

注意 :我有一个抽象的父状态,它有一个具有http调用的控制器,所以这解释了所做的请求。 但是并没有解释为什么页面需要重新加载。

.state('user', {
  templateUrl: 'views/users/master-user.tpl.html',
  url: '',
  abstract: true,
  controller: 'userMaster'
})

尝试使用$stateChangeStart也会重新加载页面:

 $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
   Access.hasORRoles(['admin']).then(function (res) {
  }, function (err) {
    if (toState.name == 'user.agent-admin') {
      $state.go('user.home');
    }
  });
 });

我也试过:

a)直接拒绝

.state('user.agent-admin', {
  url: '/agent-admin',
  templateUrl: 'views/users/agent-admin.tpl.html',
  controller: 'userAgentAdminCtrl',
  resolve: {
    test: function ($q) {
      return $q.reject(301);
    }
    ...

 $rootScope.$on('$stateChangeError', function (event, toState, toParams, fromState, fromParams, error) {
   if (error === 301) {
     $state.go('user.home');
   }
 });

b)防止违约(这里建议)

 $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
   $q.reject().then(function (res) {
  }, function (err) {
      event.preventDefault();
  });
 });

c)使用新的UI路由器1.0.0 Alpha $ transitions.onBefore事件:

  // resolve user profile before any transitions begin
  $transitions.onBefore({to: 'user.*', from: '*'}, function(trans, state) {
   var substate = trans.to();
   return $rootScope.loadProfile().then(function (prof) {
      if (substate.name == 'user.agent-admin') {
        return Access.hasORRoles(substate.data.roles);
      }
      return true;
    });
  });

  $transitions.onError({}, function(trans) {
    var error = trans && trans._error;
    if (error == 301) {
        $state.go('user.home');
    }
    ...
  });

没有阻止状态改变和页面重新加载。

链接地址: http://www.djcxy.com/p/77953.html

上一篇: prevent $state from reloading

下一篇: angular ui router: component $onInit fires twice on route change