Javascript 从指令内访问关联控制器

Javascript 从指令内访问关联控制器,javascript,angularjs,Javascript,Angularjs,像这样的HTML <div ng-app="myApp"> <div ng-controller="inControl"> I like to drink {{drink}}<br> <input my-dir ng-model="drink"></input> </div> </div> var app = angular.module('myApp', [])

像这样的HTML

<div ng-app="myApp">
    <div ng-controller="inControl">
        I like to drink {{drink}}<br>
        <input my-dir ng-model="drink"></input>
    </div>
</div>
var app = angular.module('myApp', []);

app.controller('inControl', function($scope) {
    $scope.drink = 'water';
});

app.directive('myDir', function(){
    return {
        restrict: 'A',
        link: function($scope, element, attrs, ctrl) {

            // why is this logging undefined?
            console.log(ctrl);

        }
    };
});
为什么我不能从指令中访问控制器?为什么我对
ctrl
的调用未定义


编辑:添加演示


此处可用的Fiddle:请参见多个控制器可以与一个应用程序连接,类似地,多个指令可以与一个应用程序连接,因此,如果您希望在一个指令中使用一个控制器,则可以将指令的控制器属性设置为您希望与之连接的控制器的名称,就像您的情况一样

app.directive('myDir', function(){
    return {
        restrict: 'A',
        controller: 'inControl'

        link: function($scope, element, attrs, ctrl) {
            // why is this logging undefined?
            console.log(ctrl);
        }
    };
});

添加
require:'ngModel',
为我修复了它-不确定是否有其他方法指定它

app.directive('myDir', function(){
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function($scope, element, attrs, ctrl) {

            // why is this logging undefined?
            console.log(ctrl);

        }
    };
});

尽管使用
require:ngModel
,这仍然不是最好的方法,因为它将指令直接绑定到控制器。如果希望指令与控制器通信,可以设置并读取范围

HTML:

或者,您可以使用
my dir=“{{drink}}”
并将其读取为
attrs.myDir


您希望从控制器访问什么?您可以访问
范围
?@tymeJV-我想访问
ctrl.$modelView
我将控制器属性添加到指令中,它似乎对我有效。我更喜欢jsbin而不是jsfiddle,因为在我的控制台中没有任何错误。很好,我想我明白了。。。需要添加
require:'ngModel',
以返回object看起来很有意义,但对我来说不起作用-我仍然无法定义
ctrl
内部函数。正如我在上一条评论中提到的-我想我解决了<代码>要求:'ngModel'
<div ng-app="myApp">
  <div ng-controller="inControl">
    I like to drink {{drink}}<br />
    <input my-dir="drink"></input>
  </div>
</div>
var app = angular.module('myApp', []);

app.controller('inControl', function($scope) {
    $scope.drink = 'asdfasdf';
});

app.directive('myDir', function(){
    return {
        restrict: 'A',
        link: function(scope, element, attrs) {
            console.log(scope[attrs.myDir]);
        }
    };
});