Angularjs 向指令添加自定义事件

Angularjs 向指令添加自定义事件,angularjs,angularjs-directive,Angularjs,Angularjs Directive,我有一个自定义指令,它创建一个字段作为更大表单的一部分。经过极大简化,它看起来如下所示: .directive('entityField', function () { return { restrict: 'E', scope: { field: '=', attributes: '=', editMode: '=' }, templateUrl: '

我有一个自定义指令,它创建一个字段作为更大表单的一部分。经过极大简化,它看起来如下所示:

.directive('entityField', function () {
    return {
        restrict: 'E',
        scope: {
            field: '=',
            attributes: '=',
            editMode: '='
        },
        templateUrl: '<input ng-blur="blur()" type="text"/>',

        link: function (scope, element, attrs) {
            scope.blur = function() {
                // call out to event listeners that blur event happened
            }
        }
    };
});
指令('entityField',函数(){ 返回{ 限制:'E', 范围:{ 字段:'=', 属性:'=', 编辑模式:'=' }, templateUrl:“”, 链接:函数(范围、元素、属性){ scope.blur=函数(){ //向事件侦听器调出发生模糊事件的消息 } } }; }); 我的目标是让指令在其输入元素的模糊上触发事件,以便周围的控制器可以处理模糊事件并执行一些复杂的验证


那么,如何在指令中引发事件,以便周围的控制器可以侦听它?

如果您没有使用隔离作用域,则可以使用
$emit
将事件发送到控制器的作用域。但是,由于您使用的是隔离作用域,因此指令不会从父控制器的作用域继承,这使得此方法不可能

相反,您可以使用
$rootScope
中的
$broadcast
方法将事件沿作用域原型链发送到控制器:

指令:

.directive('entityField', function ($rootScope) {
    return {
        restrict: 'E',
        scope: {
            field: '=',
            attributes: '=',
            editMode: '='
        },
        templateUrl: '<input ng-blur="blur()" type="text"/>',

        link: function (scope, element, attrs) {
            scope.blur = function() {
                $rootScope.$broadcast('blur');
            }
        }
    };
});
.controller('MyController', function($scope){
    $scope.$on('blur', function(){
        //react to event
    })
});

希望这是对你的问题的最狭隘的解释的一个充分的回答。我还想提到的是,通常最好使用作用域和/或服务的原型性质进行跨指令/控制器通信。我今天对另一个问题的回答有助于涵盖这一主题:

可能是错误的,但将
链接
函数替换为:
控制器:函数($scope){$scope.blur=function(){}
-如果可行,则不是100%。上面的指令可以更改。明天,我将尝试使用隔离作用域和$emit,因为这似乎是做我需要做的事情的最优雅的方式。
$emit
在没有任何更改的情况下为我工作。谢谢