是否可以在不声明的情况下访问控制器?

时间:2015-12-09 16:14:22

标签: angularjs angularjs-directive angularjs-controller

我有点奇怪的情况要求我通过指令范围变量将我的控制器传递给我的指令。只要每个路由只使用一个控制器,这在我的$routeProvider中声明,就可以正常工作。

但是现在我必须在同一模板中使用2个控制器,这会导致问题,因为我无法使用ng-controller声明我的控制器,因为这会抛出routeProvider错误,因为我正在尝试访问数据从我的路线解决。 (如果您在与解析相同的路径中声明控制器,则只能访问路径解析数据,然后在模板中使用ng-controller并且指令中的controller对我无效。

所以这就是我想要做的事情:

// Declare one controller in the routing
.when('/someroute', {
  controller: 'MyCtrl'
}

// But pass a different controller to my directive that hasn't been declared 
// in either the route, template or directive
<my-directive ctrl="MyOtherCtrl"></my-directive>

但我的问题是,是否可以访问控制器及其功能,而无需在指令或路由中将控制器声明为ng-controllercontroller?我的一个牵强附会的想法是,有一个服务或者你能注入的东西可以容纳所有的控制器,但到目前为止我还没有拿出来。

2 个答案:

答案 0 :(得分:0)

您可以使用$ controller将控制器按名称注入指令控制器。

var someOtherController = $ controller(&#39; SomeOtherController&#39;,{$ scope:$ scope});

现在可以在$ scope上使用它的方法。不过要小心,事情会很快变得毛茸茸。

答案 1 :(得分:0)

有一项服务可以获取任何控制器的实例,使用$controller

在您的指令中

注入$controller服务,然后在link函数中使用它:

myApp.directive("myDirective", function($controller){
  return {
  scope: {
    ctrl: "@"
  },
  link: function(scope, element, attrs){
    var myNeededCtrl = $controller(scope.ctrl, {$scope: scope, otherDepenciesThatTheControllerNeed: ...});
    myNeededCtrl.doSomething();
  }
 };
});