我想将控制器中定义的功能暴露给子控制器。实质上这是:
.state('parent', {
controller: 'ParentCtrl',
})
.state('parent.child', {
controller: 'ChildCtrl', // how to inject ParentCtrl?
})
当然,那是不可用的。那么解决怎么样?试试吧:
.state('parent', {
resolve: {
ParentCtrl: 'ParentCtrl',
}
})
.state('parent.child', {
resolve: {
ChildCtrl: 'ChildCtrl', // just declare ParentCtrl as injected dependency
}
})
但是,如果ParentCtrl或ChildCtrl是使用angular.controller
声明的Angular控制器,则不起作用:
http://plnkr.co/edit/ggHkZTkQJSsL24sm7X2V
那么如果我们为他们提供服务呢?
http://plnkr.co/edit/Sl1qxWcub6bvXZfPEvHE
嘿,这很有效!但是,如果我想将已解析的依赖项注入其中呢?嗯,这不起作用。无论如何,一次只能存在一个服务实例,并且已解析的依赖关系不在其创建的范围内:http://plnkr.co/edit/gsvJlJSpx2WEB1s6l7NU
不幸的是,ui-router无法解析控制器。似乎唯一的解决方案是将我的控制器定义为angular.constant
,然后将其注入我的模块config
,然后构造一个具有已解析依赖关系的控制器:
http://plnkr.co/edit/8gGKNxjpv2OgS0obNvVi
有更好的选择吗?
答案 0 :(得分:0)
您实际上可以注入$controller
服务并在解析期间返回控制器的实例。原因是你不能按原样注入控制器。
实施例: -
ParentCtrl: function($controller){
return $controller('ParentCtrl');
}
<强> Demo 强>
但如果它是一种非常常用的功能,那么它们可能应该驻留在服务中。另外一件事是使用Controller As
语法,您仍然可以使用别名在子控制器中访问它们。有一个很好的解释about it here