解决控制器?

时间:2014-09-04 22:39:30

标签: javascript angularjs angular-ui-router

我想将控制器中定义的功能暴露给子控制器。实质上这是:

.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

有更好的选择吗?

1 个答案:

答案 0 :(得分:0)

您实际上可以注入$controller服务并在解析期间返回控制器的实例。原因是你不能按原样注入控制器。

实施例: -

  ParentCtrl: function($controller){
    return $controller('ParentCtrl');
  } 

<强> Demo

但如果它是一种非常常用的功能,那么它们可能应该驻留在服务中。另外一件事是使用Controller As语法,您仍然可以使用别名在子控制器中访问它们。有一个很好的解释about it here