我是否可以在指令中使用ng-controller设置控制器?

Gus*_*tav 4 angularjs angularjs-directive angularjs-controller

我有(以下)html:

    <div ng-controller="MyController">
       <my-sub-directive></my-sub-directive>
    </div>
Run Code Online (Sandbox Code Playgroud)

控制器的外观并不重要:

app.controller("MyController", function($scope) {
   $scope.foo = "bar";
})
Run Code Online (Sandbox Code Playgroud)

我的指令看起来像这样:

function mySubDirective() {
        return {
            restrict: "E",
            templateUrl:"aTemplate.html",
            require: "^MyController",
            link: function($scope, element) {

            }
        };
    }
app.directive("mySubDirective", mySubDirective);
Run Code Online (Sandbox Code Playgroud)

在文档中,他们总是在require-property中指定另一个指令,但它表示这意味着你需要控制器.所以我想尝试这个解决方案.但是我得到了错误

"无法找到指令'mySubDirective'所需的控制器'MyController'".

如果由ng-controller设置,是否不能要求指令中的控制器?

New*_*Dev 5

你只能这样做:

require: "^ngController"
Run Code Online (Sandbox Code Playgroud)

所以,你不能比那更具体,即你不能要求"MainCtrl""MyController"通过名称,但它会得到控制器实例:

.controller("SomeController", function(){
   this.doSomething = function(){
     //
   };
})

.directive("foo", function(){
  return {
    require: "?^ngController",
    link: function(scope, element, attrs, ctrl){
      if (ctrl && ctrl.doSomething){
        ctrl.doSomething();
      }
    }
  }
});
Run Code Online (Sandbox Code Playgroud)
<div ng-controller="SomeController">
   <foo></foo>
</div>
Run Code Online (Sandbox Code Playgroud)

我不认为,虽然,这是一个很好的方法,因为它使指令非常依赖于地方使用它.您可以按照注释中的建议直接传递控制器实例 - 它使它更明确一些:

<div ng-controller="SomeController as ctrl">
  <foo ctrl="ctrl"></foo>
</div>
Run Code Online (Sandbox Code Playgroud)

但它仍然是一个过于通用的对象,很容易被指令的用户误用.

相反,公开一个定义良好的API(通过属性)并将引用传递给控制器​​中定义的函数/属性:

<div ng-controller="SomeController as ctrl">
  <foo do="ctrl.doSomething()"></foo>
</div>
Run Code Online (Sandbox Code Playgroud)