UI-Router在$ stateChangeSuccess

时间:2016-08-17 18:24:50

标签: angularjs angular-ui-router

如果用户尚未完成所有必需的注册步骤,我需要阻止用户访问应用上的某些状态(信息中心和帐户)。如果用户尝试通过直接URL输入访问这些状态,我会将它们重定向回原来的位置。我在run块上进行了这个简单的检查,以有条件地重定向用户:

$rootScope.$on("$stateChangeSuccess", (event, toState, toParams, fromState, fromParams) => { 
    let shouldPreventNavigationToAccountPages = fromState.name.includes('enroll') && toState.parent === 'layout';

    if (shouldPreventNavigationToAccountPages) {
      redirectUser();
    }
} 

因此,如果用户来自“注册”状态(例如“enroll.step-one”)并尝试访问不允许的“布局”状态,则应重定向它们。但是,当我直接输入URL(没有点击链接)时,“fromState”返回以下对象:

{name: "", url: "^", views: null, abstract: true}

我无法访问之前的状态,无法对fromState.name.includes('enroll')执行检查。这是UI-Router中的默认行为吗?如果用户通过直接在浏览器上输入URL来尝试访问页面,有没有办法获得以前的状态?

2 个答案:

答案 0 :(得分:0)

  

如果用户尚未完成所有必需的注册步骤,我需要阻止用户访问应用上的某些状态(信息中心和帐户)。

通过拒绝解析器阻止用户进入州。

myApp.config(function($stateProvider, $urlRouterProvider) {

  $stateProvider
    .state('dashboard', {
      url: "/dashboard",
      resolve: { 
          enrolled: function(enrollmentStatus) {
              if (enrollmentStatus.enrolled) {
                  return "enrolled";
              } else {
                  //throw to reject resolve
                  throw "not enrolled";
              };
          }
      },
      templateUrl: "partials/dashboard.html"
    })

通过跟踪服务的注册状态,可以拒绝状态更改,而不考虑之前的状态。

更新

$stateChangeError事件可用于处理拒绝。

$rootScope.$on("$stateChangeError", function(event, toState, toParams, fromState, fromParams, error) {
  if (error && fromState.name=='') {
    $state.go("enroll");
  }
});

有关详细信息,请参阅UI Router $state API Reference -- $stateChangeError

答案 1 :(得分:0)

你非常接近。你所缺少的是:

$rootScope.$on("$stateChangeSuccess", (event, toState, toParams, fromState, fromParams) => { 
    let shouldPreventNavigationToAccountPages = fromState.name.includes('enroll') && toState.parent === 'layout';
    if (shouldPreventNavigationToAccountPages) {
      //This
      event.preventDefault();
      redirectUser();
    }
}