将控制器传递给指令 - AngularJS

时间:2013-04-22 21:25:40

标签: angularjs angularjs-directive

我有一个简单的场景,我试图找出答案。

我有一个控制器(它与对话框有界)。控制器看起来像这样:

app.controller('fullCtrl', function ($scope, $dialog, $http, $log, apiService, stateService, promiseData, dialog, leaf, CONST) {
...
}

对话框中的一个ui元素是使用指令呈现的画布:

<div leaf-graph structure=structure></div>
app.directive('leafGraph', ['$timeout',  function (timer, $log) {
...
}

问题在于我正在寻找指令与控制器交互的方法,因此当用户单击指令时,控制器会将自身重新绑定到新数据。

基本上,它全部在javascript端完成,用户双击画布上的某些区域,它应该在控制器上触发一些动作。

有没有办法将控制器传递给指令?

THX

2 个答案:

答案 0 :(得分:2)

您已经可以访问指令中的$ scope,包括您在该范围内定义的任何控制器函数。以下是一个示例:Egghead.io - Directives Talking to Controllers

答案 1 :(得分:0)

值得注意的是,在ng-repeat循环中使用$ apply的指令会导致“错误:$ digest已在进行中”。

至少还有其他两种方法可以正常工作,而不会产生错误。

  • 这个允许将参数传递给指定的函数:

    范围$的eval(attrs.repeatDone);

用法:

<div ng-repeat="feed in feedList" repeat-done="layoutDone($index)"> or
<div ng-repeat="feed in feedList" repeat-done="layoutDone()">
  • 这个只需要函数名,不需要“()”或传递参数:

    范围[attrs.repeatDone]();

用法:

<div ng-repeat="feed in feedList" repeat-done="layoutDone">

指令:

.directive('onEnter', function() {
    return function(scope, element, attrs) {
        element.on('keydown', function(event) {
            if (event.which === 13) {
                scope.$eval(attrs.onEnter);
            }
        })
    }
})