【发布时间】:2015-07-12 13:36:01
【问题描述】:
我正在使用 event.preventDefault() 技术根据我从后端获取的标志值有条件地将用户重定向到适当的状态。 Eveything 似乎工作正常,除了有时会呈现实际页面然后发生重定向,而且在极少数情况下也是如此。实际页面的这种渲染时间也很短。以下是我正在使用的代码 sn-p:
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams){
if (fromState.name === '' && toState.name === "myState"){
Auth.isLoggedInAsync(function(loggedIn) {
if (!loggedIn) {
event.preventDefault();
$state.go('state1');
} else {
event.preventDefault();
Auth.getNextStateForUser()
.then(function(data) {
console.log(data.nextState);
$state.go(data.nextState);
})
.catch(function(err){
console.log(err);
$state.go(toState.name);
});
}
});
我遵循的逻辑是,检查用户是否登录,然后重定向到 state1,否则根据从后端获取的 nextstateValue 重定向到下一个适当的状态。如果出现错误,直接打开实际页面,不做任何重定向。
我希望我清楚自己在做什么。只是想知道我所面临的问题是真正的问题还是我在做错了什么。
我也将它发布在 github 页面上,但似乎我是唯一一个面临这个问题的人。
请检查此以获取更多信息: https://github.com/angular-ui/ui-router/issues/2088
谢谢
编辑:根据答案,我更新了使用 ui-router 解析的代码并将我的 isLoggedInAsyc 转换为返回承诺。
resolve: {
promiseState: function(Auth, $state, $q, $stateParams) {
var deferred = $q.defer();
Auth.isLoggedInSync()
.then(function(isLoggedIn){
console.log(isLoggedIn);
if(isLoggedIn) {
Auth.getNextStateForUser()
.then(function(data) {
console.log(data.nextState);
$state.go(data.nextState);
deferred.resolve(data);
})
.catch(function(error) {
console.log(error);
deferred.reject(error);
});
}
deferred.resolve(isLoggedIn);
})
.catch(function(err){
console.log(err);
deferred.reject(err);
});
return deferred.promise;
}
}
我的 isLoggedIn() 返回承诺。
isLoggedInSync: function(callback) {
var cb = callback || angular.noop;
var deferred = $q.defer();
if(currentUser.hasOwnProperty('$promise')) {
currentUser.$promise.then(function() {
deferred.resolve(true);
return cb(true);
}).catch(function() {
deferred.resolve(false);
return cb(false);
});
} else if(currentUser.hasOwnProperty('role')) {
deferred.resolve(true);
} else {
deferred.resolve(false);
}
return deferred.promise;
}
【问题讨论】:
-
我认为角码/事件应该是
$event而不是event。 -
我们之前在代码中遇到过这个问题。处理这种逻辑的最好方法是将角色重定向放在
resolve中。这些可以异步完成,并且所有解析处理程序必须被调用并具有结果(返回的承诺也必须被解析)才能切换到状态。
标签: javascript angularjs express angular-ui-router