使用"要求"在指令中要求父控制器

时间:2015-06-05 18:31:25

标签: angularjs

我试图"要求"父控制器(非指令)但AngularJS返回异常。代码是这样的:

JS

app.controller("myController", function ($scole) {
    ...
});

app.directive("myDirective", function ($q) {
    return {
        require: "^myController",
        template: "",
        link: function (scope, element, attrs, myCtrl) {
            ...
        }
    };
});

HTML

<div ng-controller="myController as myCtrl">
    ...
        <div my-directive>...</div>
    ...
</div>

错误

  

错误:[$ compile:ctreq]控制器&#39; myController&#39;,需要   指令&#39; myDirective&#39;,无法找到!

为什么?
也许,require属性必须引用指令的控制器

由于

2 个答案:

答案 0 :(得分:7)

要求在另一个指令中使用其他指令控制器,请参考以下示例

var App =  angular.module('myApp',[]);

//one directive

App.directive('oneDirective',function(){

  return {
      restrict: 'E',
      controller:function($scope){

       $scope.myName= function(){
            console.log('myname');
          }

         }
    }

});

   //two directive

  App.directive('twoDirective',function(){

  return {
      require:'oneDirective' //one directive used,
      link : function(scope,ele,attrs,oneCtrl){
         console.log(oneCtrl.myName())
     }

   }

  })

答案 1 :(得分:5)

表示法require: "^myController"表示您的指令将尝试访问另一个名为myController的指令,并在某些祖先标记上定义为my-controller属性或<my-controller>标记。在你的情况下,你没有这样的指令,因此例外。

这不是你想要做的非常传统,但是如果真的想要在你的指令中要求外部控制器,你可以要求ngController

app.directive("myDirective", function($q) {
    return {
        require: "^ngController",
        template: "",
        link: function(scope, element, attrs, myCtrl) {
            // ...
            console.log(myCtrl);
        }
    };
});

然而,这不是一个好主意。我无法想象你为什么会这样需要它。我建议查看scope配置属性以及如何将可执行函数引用从外部控制器传递到指令中。

<div my-directive some-callback="test()"></div>

并在指令中定义范围:

scope: {
    someCallback: '&'
}

在控制器中,您将拥有$scope.test = function() {};。然后你不需要在指令中明确要求控制器。