AngularJS控制器 - 指令 - >从指令调用Controller函数

时间:2015-09-27 07:04:28

标签: angularjs angularjs-directive

我有一个关于控制器和指令之间的功能可见性的问题。我有一个控制器和一个指令。该指令看起来像这样

(function() {
'use strict';

angular
    .module('myproject.schedule')
    .directive('dirname', dirname);

function dirname() {
  var directive = {
        restrict: 'A',
        replace: true,
        scope: {
            currentDateScheduler: "=",
            ...
        },
        controller: DirnameController,
        controllerAs: 'vm',
        bindToController: true,
        templateUrl: ... directive.html

我的控制器看起来像这样:

(function() {
'use strict';

angular
    .module('myproject.schedule')
    .controller('MyController', MyController);
...

在directive.html文件中,我有一个 ng-click ,它调用了我的控制器的功能 - 这很好用。

实际上现在我不确定为什么?我认为指令有自己的命名空间,我的控制器的功能在... directive.html中不可见。

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

控制器范围可用于在声明控制器的DOM元素中显示为子节点的任何指令。 E.g。

<div ng-controller="ctrl1">
    <dirname></dirnam> <!-- this has access to ctrl1 scope -->
</div>

因此,如果您要在另一个控制器中使用该指令,则可以访问该控制器范围。这意味着如果控制器中存在该指令所声明的功能,那么ng-click将不执行任何操作。

在指令中,您可以声明一个控制器,在此控制器中声明的任何内容都将覆盖指令中同名的控制器函数。 E.g。

angular.module('myApp',[])
.controller('myController',function($scope){
    $scope.clickMe = function(){
       alert('clicked from the controller');
    }
})
.directive('dirname', function(){
    return {
        controller: function($scope){
            $scope.clickMe = function(){ alert('clicked from directive'); };
        },
    };
});

控制器也可以嵌套。在这种情况下,范围再次具有自上而下的效果,其中在最顶层控制器中定义的函数可用于子控制器中包含的dom元素。此外,如果此子控制器声明了相同的函数,那么这些将覆盖父控制器的功能。

希望这有帮助

相关问题