Angularjs 角度UI路由器状态解析取决于另一个解析
编辑:这实际上是可行的,问题来自其他方面 我正在努力解决一个边缘案例场景,基本上:Angularjs 角度UI路由器状态解析取决于另一个解析,angularjs,angular-ui-router,Angularjs,Angular Ui Router,编辑:这实际上是可行的,问题来自其他方面 我正在努力解决一个边缘案例场景,基本上: $stateProvider.state('myState', { resolve:{ resolveA: function($q){ return $q.when('whatever'); }, resolveB: function(resolveA){ return fetchSomethingBasedOn(resolveA); } } )
$stateProvider.state('myState', {
resolve:{
resolveA: function($q){
return $q.when('whatever');
},
resolveB: function(resolveA){
return fetchSomethingBasedOn(resolveA);
}
}
);
这不起作用,因为无法在resolveB
函数中插入resolveA
我已经考虑过但拒绝了以下几个选项:
{resolveA,resolveB}
。已放弃,因为这将对我现有的控制器产生许多副作用控制器
级别处理resolveB行为。丢弃,因为此状态是抽象的高级状态,我不想更改其所有子级状态/控制器
看起来不错的选项是将resolveB的结果附加到resolveA对象,并且只有一个resolve。i、 e:
$stateProvider.state('myState', {
resolve:{
resolveA: function($q){
return $q.when('whatever').then(function(resolveA){
return fetchSomethingBasedOnResolveA(resolveA).then(function(resolveB){
resolveA.resolveB = resolveB;
return resolveA;
})
});
}
}
);
不能在同一状态下工作,但应该在嵌套状态下工作。您可以从父状态访问已解析的对象
$stateProvider
.state('parent', {
resolve:{
resolveA: function($q){
return $q.when('whatever');
}
}
)
.state('parent.child', {
resolve:{
resolveB: function(resolveA){
return fetchSomethingBasedOn(resolveA);
}
}
);
解决你的问题的方法是使用承诺。在开始使用resolveB之前,必须确保resolveA的承诺已得到解决 代码应该是这样的
$stateProvider.state('myState', {
resolve:{
resolveA: function($q){
var def = $q.defer();
//whatever you want i.e.
User.resource.get(function(perfil){
def.resolve(perfil);
});
//
return def.promise;
},
resolveB: function(resolveA){
return fetchSomethingBasedOn(resolveA);
}});
这应该能解决你的问题
问候。事实上,这应该行得通。你可以做你想做的事,你必须确保你的决心会回报你的承诺。我试过了,但从来没有成功过。你能提供一个有效的例子吗?这很奇怪。我会继续努力的,我知道了。我试图注入一个名称拼写错误的服务。。。我真丢脸。