指令无法访问控制器功能(AngularJS)

时间:2014-09-05 00:55:56

标签: angularjs angularjs-directive angularjs-controller

当我声明要使用的指令访问控制器功能时,它找不到控制器。

这是我在 app.js 中声明的指令:

app.directive("delete", function() {
    return {
        restrict: 'A',
        link: function(scope, elem, attr, ctrl) {
            elem.bind('click', function(e) {

                alertCtrl.alert();

            });
        }
    }
});

这是我的控制器:

app.controller('AlertController',  function() {

    this.alert = function() {
        alert('Ahah!');
    }


});

这是我的HTML:

<div ng-controller="AlertController as alertCtrl">

    <div ng-repeat="i in [1,2,3]">

        <img src='image.png' delete />

    </div>

</div>

如果我点击图片,我没有收到任何警报,控制台说没有定义alertCtrl。为什么单击带有删除指令的图像时没有定义alertCtrl?

如果我将控制器更改为$ scope.alert = function()......它可以正常工作。但我不想要这个。

另外,这是处理这种情况的正确方法吗?如果没有,最佳做法是什么?

1 个答案:

答案 0 :(得分:3)

你需要在范围内打电话。 scope具有属性alertCtrl,它是您的控制器实例。当您在html上绑定它时,您的控制器别名(alertCtrl)可用,因为scope隐含在那里。但是当你在javascript中执行它,即在指令或其他控制器中,你需要从作用域获取控制器实例(定义为别名)作为属性。

 scope.alertCtrl.alert();

<强> Plnkr