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
在没有任何更改的情况下为我工作。谢谢