Nic*_*ick 14 javascript angularjs angular-ui-router
我试图确保用户在允许用户转换到特定状态之前进行身份验证.据我所知(在审查其他帖子之后),如果状态的resolve返回被拒绝的promise并且应该引发'$ stateChangeError'事件,则不应该发生状态转换.然而,这不是我所经历的.
单步执行以下代码,我可以看到延迟的promise被拒绝,但仍然发生状态转换,并且未触发'$ stateChangeError'.在我的模块的配置中,我有以下状态:
.state('accounts', {
url: '/Accounts',
controller: 'AccountsController',
templateUrl: 'Scripts/angular/accounts/templates/accounts.tpl.html',
resolve: {
authenticated: ['$q', 'AccountService', function ($q, accountService) {
var deferred = $q.defer();
accountService.userLoggedIn().then(function (loggedIn) {
if (loggedIn) {
deferred.resolve();
} else {
deferred.reject('Not logged in'); <-- This happens
}
return deferred.promise;
});
}]
}
})
Run Code Online (Sandbox Code Playgroud)
在同一个模块中,在run函数中我有:
$rootScope.$on('$stateChangeError',
function (event, toState, toParams, fromState, fromParams, error) {
$log.debug(error); <-- This is never called
$state.go('login');
});
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
Eva*_*bbs 20
你在错误的地方归还了诺言.Authenticated需要是一个返回promise的函数,但是你只是在.then()函数中返回promise,然后验证返回undefined:
resolve: {
authenticated: ['$q', 'AccountService', function ($q, accountService) {
var deferred = $q.defer();
accountService.userLoggedIn().then(function (loggedIn) {
if (loggedIn) {
deferred.resolve();
} else {
deferred.reject('Not logged in'); <-- This happens
}
});
return deferred.promise;
}]
}
Run Code Online (Sandbox Code Playgroud)
你不需要创建新的延迟,因为你已经从userLoggedIn()获得了承诺:
resolve: {
authenticated: ['$q', 'AccountService', function ($q, accountService) {
return accountService.userLoggedIn().then(function (loggedIn) {
if (loggedIn) {
return loggedIn;
} else {
return $q.reject('Not logged in');
}
});
}]
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13384 次 |
| 最近记录: |