Angularjs 防止基于HTTP查询的ui路由器中的状态更改
假设我有以下路径,我如何防止ui路由器中特定“到”状态的状态更改(是否使用OneNet?):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' } }) 您可以创建规则,如中所示 改编他们的例子:
.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);
});
}
}
})