【发布时间】:2015-12-06 18:34:37
【问题描述】:
我有一些这样定义的路线:
$stateProvider
.state('app', {
url: '/',
abstract: true,
views: {
'menuContent': {
templateUrl: 'templates/home.html'
}
}
})
.state('app.restricted', {
url: '/restricted',
views: {
'content': {
templateUrl: 'templates/restricted/restricted-dashboard.html',
controller: 'RestrictedController as vmRestricted'
}
},
resolve: {
isGranted: 'isGranted'
}
})
.state('app.restricted.pending', {
url: '/pending',
views: {
'tabsView': {
templateUrl: 'templates/restricted/restricted-manage-pending.html',
controller: 'RestrictedPendingController as vm'
}
},
resolve: {
isGranted: 'isGranted'
}
})
.state('app.restricted.devices', {
url: '/devices',
views: {
'tabsView': {
templateUrl: 'templates/trusted/restricted-manage-devices.html',
controller: 'RestrictedDevicesController as vm'
}
},
resolve: {
isGranted: 'isGranted'
}
})
.state('app.grant', {
url: '/grant-access',
views: {
'content': {
templateUrl: 'templates/grant-access.html',
controller: 'GrantAccessController as vm'
}
}
})
;
在这些路线中,我有一个限制区域和一个授予访问权限页面以授予对限制区域的访问权限。
当isGranted 解析提供程序被拒绝时,我重定向到app.grant 路由。
这是执行此操作的代码:
$rootScope.$on(AngularEvents.STATE_CHANGE_ERROR, _onStateChangeError);
function _onStateChangeError(event, toState, toParams, fromState, fromParams, error){
switch (error) {
case 'accessRejected':
$state.go('app.grant');
break;
}
}
这是我的isGranted 提供者的代码:
(function() {
'use strict';
angular.module('app')
.provider('isGranted', isGrantedProvider);
isGrantedProvider.$inject = [];
function isGrantedProvider() {
this.$get = isGranted;
isGranted.$inject = ['$q', '$log', 'grantService'];
function isGranted($q, $log, grantService){
$log.log('isGrantedProvider');
if (grantService.isGranted()) {
return $q.when(true);
} else {
return $q.reject('accessRejected');
}
}
}
})();
(grantService.isGranted() 只是返回一个布尔值)
当我第一次使用$state.go('app.restricted') 去app.restricted 路由时,提供程序被执行。
该路由被拒绝,因为访问未被授予,我们被重定向到app.grant 路由。
在此页面中,用户可以登录并访问受限区域。用户登录后,我们将他重定向到 app.restricted.pending 路由,但未调用解析,路由被拒绝,我们再次重定向到 app.grant 路由,而访问被授予。
为什么没有调用 resolve? 有办法强制吗?
编辑
经过一些测试,我有了新的信息。
我看到只有当它是服务时才第二次调用resolve:
这个resolve总是在我们进入状态时执行:
state('app.restricted', {
url: '/restricted',
views: {
'content': {
templateUrl: 'templates/restricted/restricted-dashboard.html',
controller: 'RestrictedController as vmRestricted'
}
},
resolve: {
isGranted: ['$log', function($log) {
$log.log('RESOLVE');
}]
}
})
但是即使我再次进入状态,这个解析也只会执行一次:
state('app.restricted', {
url: '/restricted',
views: {
'content': {
templateUrl: 'templates/restricted/restricted-dashboard.html',
controller: 'RestrictedController as vmRestricted'
}
},
resolve: {
isGranted: 'isGranted'
}
})
angular.module('app')
.provider('isGranted', isGrantedP);
isGrantedP.$inject = [];
function isGrantedP() {
this.$get = isGranted;
isGranted.$inject = ['$q', '$log'];
function isGranted($q, $log){
$log.log('RESOLVE');
}
}
为什么不是每次都调用这个服务?是因为服务是单例吗?我应该如何进行?
【问题讨论】:
-
确定没有调用resolve还是grantService返回了错误的值?
-
@AurélienThieriot 我确定它没有被调用,因为提供程序中的 $log 没有显示
标签: angularjs angular-ui-router ionic