阻止$ 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