我想将控制器中定义的功能公开给子控制器。实质上,这是:
.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声明的角控制器,则这是行不通的
http://plnkr.co/edit/ggHkZTkQJSsL24sm7X2V
如果我们给他们提供服务呢?
http://plnkr.co/edit/Sl1qxWcub6bvXZfPEvHE
嘿,真管用!但是,如果我想向它注入一个已解决的依赖呢?嗯,那不管用。无论如何,一次只能存在一个服务实例,并且已解析的依赖项不在创建它的范围内:
http://plnkr.co/edit/gsvJlJSpx2WEB1s6l7NU
不幸的是,ui-路由器无法解析控制器。似乎唯一的解决方案是将控制器定义为angular.constant,然后将其插入到模块的config中,然后构造具有已解析依赖项的控制器:
http://plnkr.co/edit/8gGKNxjpv2OgS0obNvVi
还有更好的选择吗?
发布于 2014-09-05 02:08:56
实际上,您可以在解析期间注入$controller服务并返回控制器的实例。原因是您不能只按原样注入控制器。
例子:-
ParentCtrl: function($controller){
return $controller('ParentCtrl');
} 演示
但是,如果它是一个非常常用的功能,那么它们可能应该驻留在服务中。另外一件事是使用Controller As语法,您仍然可以使用别名在子控制器中访问它们。关于这里有一个很好的解释
https://stackoverflow.com/questions/25676056
复制相似问题