我因为无法理解Angular-UI UI-Router而被杀死。我的状态定义如下:
$stateProvider
.state('member', {
url: '/member/:membersId',
templateUrl: 'templates/member.html',
resolve : {
// From examples for testing
simpleObj: function(){
return {value: 'simple!'};
},
memberDetails : function(FamilyService,$state) {
return FamilyService.getMember($state.current.params.membersId);
}
},
controller: 'MemberController'
});
由于文档说$ stateParams不可用,我使用$ state.current.params。应该没事。相反,我得到了死气沉沉。我无法访问membersId
来挽救我的生命。
为了测试我的服务并确保它不是问题,我在membersId中硬编码,控制器获得memberDetails
结果以及simpleObj
结果。所以,服务和控制器,工作得很好。
硬编码的示例:
$stateProvider
.state('member', {
url: '/member/:membersId',
templateUrl: 'templates/member.html',
resolve : {
// From examples for testing
simpleObj: function(){
return {value: 'simple!'};
},
memberDetails : function(FamilyService,$state) {
return FamilyService.getMember('52d1ebb1de46c3f103000002');
}
},
controller: 'MemberController'
});
尽管文档说你无法使用$ stateParams,但我还是试过了。它也不起作用。
return FamilyService.getMember($stateParams.membersId);
我如何让membersId
参数传递到FamilyService以获得解析?
我没有多少头发可以拔掉;所以,有人请救我。
答案 0 :(得分:24)
我终于弄明白了。它在文档中非常简单。尽管多次阅读,我每次都忽略了它。我需要在解决方案中注入$ stateParams:
$stateProvider
.state('member', {
url: '/member/:membersId',
templateUrl: 'templates/member.html',
resolve : {
simpleObj: function(){
return {value: 'simple!'};
},
memberDetails : function(FamilyService,$stateParams) {
return FamilyService.getMember($stateParams.membersId);
}
},
controller: 'MemberController'
});
我仍然不明白为什么文档说这是不可能的。
两个重要的$ stateParams陷阱
$ stateParams对象仅在激活状态后填充 并解决所有依赖项。这意味着您将无法访问 它处于状态解决功能。请改用$ state.current.params。 $ stateProvider.state('contacts.detail',{resolve:{ someResolve:function($ state){ // *我们不能在此处使用$ stateParams,服务尚未就绪 // // 使用$ state.current.params代替* // return $ state.current.params.contactId +“!” }; },// ...})