Javascript 在激发$stateChangeStart之前解析抽象父级中的承诺
我试图在加载Javascript 在激发$stateChangeStart之前解析抽象父级中的承诺,javascript,angularjs,promise,angular-ui-router,angular-promise,Javascript,Angularjs,Promise,Angular Ui Router,Angular Promise,我试图在加载Home子状态之前解析抽象父状态中的一些服务器端数据。我想确保在州的data.rule函数中有用户的全名以供检查。但是,使用console.log语句,我可以看到userFullName在factory.privilegeData方法中的“done”语句之前以空字符串的形式打印到控制台 编辑 父解析中的数据是来自服务器的安全数据,需要在初始化任何控制器之前全局可用。此处仅列出一个子状态(为了可读性),但login之外的所有状态都是抽象父级的子级。完成父级解析后,数据将存储在$root
Home
子状态之前解析抽象父状态中的一些服务器端数据。我想确保在州的data.rule
函数中有用户的全名以供检查。但是,使用console.log语句,我可以看到userFullName
在factory.privilegeData
方法中的“done”语句之前以空字符串的形式打印到控制台
编辑
父解析中的数据是来自服务器的安全数据,需要在初始化任何控制器之前全局可用。此处仅列出一个子状态(为了可读性),但login
之外的所有状态都是抽象父级的子级。完成父级解析后,数据将存储在$rootScope
中,并用于在每个状态下通过data.rule
函数确定访问权限
config.js
$rootScope.$on("$stateChangeStart", function (event, toState, toParams, fromState, fromParams) {
if(toState.authenticate){
if(authService.authKeyExists()){
if(toState.data.rule($rootScope)){
navigationService.addNavObject("activity", {
summary : "Page navigation",
page : $location.absUrl().replace("#/", "")
});
} else {
$state.go('app.home');
}
} else {
event.preventDefault();
$state.go('login');
}
}
});
更新:根据下面的回答,我已经更新了父/子状态,但是我仍然遇到同样的问题:
.state('app', {
url:'',
abstract: true,
template: '<div ui-view class="slide-animation"></div>',
resolve:{
privileges: ['$q', 'privilegesService', function($q, privilegesService){
console.log('from parent resolve');
return privilegesService.getPrivileges()
.then(privilegesService.privilegesData)
.catch(privilegesService.getPrivilegesError);
}]
}
})
.state('app.home', {
url: '/home',
templateUrl: 'app/components/home/home.html',
controller: 'HomeController',
controllerAs: 'vm',
parent: 'app',
resolvePolicy: {when:'LAZY', async: 'WAIT'},
authenticate: true,
data:{
rule: function($rootScope){
console.log("from home state data rule");
return true;
}
}
})
基于上面的控制台
状态,我得到以下输出。我需要上一次出现来自家乡州数据的规则
…因为我正在使用data.rule
函数的结果对每个状态进行授权。下面是我的.run
方法中的$stateChangeStart
app.route.js
$rootScope.$on("$stateChangeStart", function (event, toState, toParams, fromState, fromParams) {
if(toState.authenticate){
if(authService.authKeyExists()){
if(toState.data.rule($rootScope)){
navigationService.addNavObject("activity", {
summary : "Page navigation",
page : $location.absUrl().replace("#/", "")
});
} else {
$state.go('app.home');
}
} else {
event.preventDefault();
$state.go('login');
}
}
});
子状态需要父状态作为依赖项,以便它等待加载,即使它没有直接使用 您必须尝试以下方法:
.state('app.home', {
url: '/home',
templateUrl: 'app/components/home/home.html',
controller: 'HomeController',
controllerAs: 'vm',
parent: 'app',
authenticate: true,
data:{
rule: function($rootScope){
console.log($rootScope.userFullName);
return true;
}
}
})
您可以使用属性并将其设置为LAZY,状态的LAZY resolves将在开始加载之前等待父状态的resolve完成。您可以在子状态中直接使用resolve并避免这种情况altogether@ZeRubeus有多个子状态使用解析中的权限数据。为了可读性,我只包含了一个。是否需要在州名称中指定点符号以及
parent
属性(在子州中)?我目前将parent
设置为app
(我将在我的帖子中添加一个编辑来澄清这一点),我需要在parent中解析的数据是站点其余部分使用的全局数据。实际上,我不需要将它注入任何子状态,它的服务器数据存储在$rootScope
中。删除父状态并使用点表示法,或者简单地使用resolvepolicy:“LAZY”我是否也需要在子状态中定义resolve
属性,或者简单地使用resolvepolicy
,因为它的父级包含resolve
?是这样:resolvepolicy:{when:'LAZY',async:'WAIT'},