Angularjs 防止基于HTTP查询的ui路由器中的状态更改

Angularjs 防止基于HTTP查询的ui路由器中的状态更改,angularjs,angular-ui-router,Angularjs,Angular Ui Router,假设我有以下路径,我如何防止ui路由器中特定“到”状态的状态更改(是否使用OneNet?): .state('auth.confirm', { url: '/confirm/:resetToken', template: '<confirm-page></confirm-page>', data: { pageTitle: 'Confirm Reset', specialClass: 'gray-bg' } }) 您可以创建规则,如中所示 改编他们的例子:

假设我有以下路径,我如何防止ui路由器中特定“到”状态的状态更改(是否使用OneNet?):

.state('auth.confirm', {
  url: '/confirm/:resetToken',
  template: '<confirm-page></confirm-page>',
  data: { pageTitle: 'Confirm Reset', specialClass: 'gray-bg' }
})

您可以创建规则,如中所示

改编他们的例子:

app.config(function($stateProvider) {
  $stateProvider.state('privatePage', {
    data: {
      rule: function(token) {
        return validateResetToken(token)
      }
  });
});
app.run(function($rootScope, $state, $stateParams) {
  $rootScope.$on('$stateChangeStart', function(e, to) {
    if (!angular.isFunction(to.data.rule)) return;
    var result = to.data.rule($stateParams.resetToken);

    if (result && result.to) {
      e.preventDefault();
      // Optionally set option.notify to false if you don't want 
      // to retrigger another $stateChangeStart event
      $state.go(result.to, result.params, {notify: false});
    }
  });
});
为了子孙后代(和谷歌人),阿隆·艾坦让我重新审视了我的
resolve
方法,我意识到我添加的
catch()
导致了被拒绝的承诺没有渗透。最后的代码是:

    .state('auth.confirm', {
      url: '/confirm/:resetToken',
      template: '<confirm-page></confirm-page>',
      data: { pageTitle: 'Confirm Reset', specialClass: 'gray-bg' },
      resolve: {
        validated: function($q, $stateParams, AuthService, toastr) {
          //$log.log('auth.confirm resolve $stateParams',$stateParams);
          return AuthService.validateResetToken($stateParams.resetToken).catch(function(validateErr) {
            toastr.error(validateErr, 'Blocked', {closeButton: true});
            return $q.reject(validateErr);
          });
        }
      }
    })
.state('auth.confirm'{
url:“/confirm/:resetToken”,
模板:“”,
数据:{pageTitle:'确认重置',specialClass:'灰色背景'},
决心:{
已验证:函数($q、$stateparms、AuthService、toastr){
//$log.log('auth.confirm resolve$stateparms',$stateparms);
返回AuthService.validateResetToken($stateParams.resetToken).catch(函数(validateErr){
toastr.error(validateErr,'Blocked',{closeButton:true});
返回$q.reject(validateErr);
});
}
}
})

您可以从部件而不是从
Oneter
执行,因为您可以拒绝从
validateResetToken
返回的承诺-它将中止状态更改()我尝试过,可能我做错了什么,但拒绝似乎并不能阻止状态更改?我想我的问题是我有
解决:。。。return AuthService.validateResetToken($stateParams.resetToken).catch(函数(){toastr.error();return null;})我被拒绝是为了做点什么。我假设返回null将导致与返回拒绝()相同的结果。@AlonEitan,实际上,您再次查看并发现了我的错误。我怎样才能让你得到一些奖励呢?:)把你的评论放到帖子里,我会选择它。没关系,我把它作为评论,因为它不是答案,只是一个建议:)+1
    .state('auth.confirm', {
      url: '/confirm/:resetToken',
      template: '<confirm-page></confirm-page>',
      data: { pageTitle: 'Confirm Reset', specialClass: 'gray-bg' },
      resolve: {
        validated: function($q, $stateParams, AuthService, toastr) {
          //$log.log('auth.confirm resolve $stateParams',$stateParams);
          return AuthService.validateResetToken($stateParams.resetToken).catch(function(validateErr) {
            toastr.error(validateErr, 'Blocked', {closeButton: true});
            return $q.reject(validateErr);
          });
        }
      }
    })