1

是否可以在可以从控制器调用的指令中创建一个函数。它应该看起来像这样:

HTML:

<div myDir id='myDir'>My dir</div>
<button ng-click="clickme()">click me</button>

JS:

app.directive("myDir", function(){
  return function(){
    var dirFunction = function(){
        alert("hello world");
    }
  }
}

app.controller("Control", function($scope){
   $scope.clickme = function(){
     angular.element('#myDir').dirFunction();
   }
}
4

2 回答 2

2

首先在您的 HTML 中更改myDirmy-dir. 在你的情况下,你不需要给id你的 div:

<div my-dir>My dir</div>
<button ng-click="clickme()">click me</button>

现在暴露dirFunction于范围。这将使您的控制器可以访问此功能:

app.directive("myDir", function(){
    return function(scope){    
        scope.dirFunction = function(){
            alert("hello world");
        }
    }
});

在您的控制器中,只需将其称为$scope.dirFunction()

app.controller("Control", function($scope){
    $scope.clickme = function(){
        $scope.dirFunction();
    }
});

注意:您不应该在控制器内部进行 DOM 操作:angular.element('#myDir').dirFunction();在控制器中是在 angularjs 中编码的一种不好的方式。将此保存为指令。

于 2013-08-23T09:57:01.640 回答
0

只是想用一个解决方案来更新它:这是 Plunk - http://plnkr.co/edit/m2YKLGGLv88jNkkgAYPp?p=preview

基本上,我使用数组中的范围变量从上面的 CodeZilla 扩展了解决方案。

$scope.func = [];

然后在指令属性functionname中传递要调用的函数的名称。

<div mydir name="dir1" functionname="sayhello1">Directive dir1</div>

然后将从指令中调用的函数添加到控制器中:

$scope.callDir1 = function (){
    $scope.func['sayhello1']();
}

$scope.callDir2 = function (){
    $scope.func['sayhello2']();
}

在指令本身中,我们使用 compile 在指令中创建将从控制器调用的函数。

app.directive('mydir', function () {
    return {
    scope: true,
    compile: function (tElement, tAttrs, transclude) {
        return function postLink(scope, iElement, iAttrs, controller) {
            scope.$parent.func[iAttrs.functionname] = function (){
                alert("update something in " + iAttrs.name);
            }

        }
    }
}
});

或者,您可以使用链接功能 - 它的工作原理相同:

app.directive('mydir', function () {
    return {
        scope: true,
        link: function (scope, element, attrs) {
            scope.$parent.func[attrs.functionname] = function () {
                console.debug("update something in " + attrs.name);
            }
        }
    }
});

而已。

于 2013-08-27T07:54:35.973 回答