当有人按下“回车”键时,我发现this question 对提交表单非常有用:
的Javascript :
angular.module('yourModuleName').directive('ngEnter', function() {
return function(scope, element, attrs) {
element.bind("keydown keypress", function(event) {
if(event.which === 13) {
scope.$apply(function(){
scope.$eval(attrs.ngEnter, {'event': event});
});
event.preventDefault();
}
});
};
});
HTML:
<div ng-app="" ng-controller="MainCtrl">
<input type="text" ng-enter="doSomething()">
</div>
我想知道的是,当按下“enter”键时,将字段设置为模糊。 doSomething()
看起来模糊发件人字段会是什么样的?
我想保留ngEnter
指令,因为我想将其重新用于其他功能。
更新: 我知道我可以创建一个完整的指令只是为了模糊(这就是我现在的方式),但我想做的是能够做这样的事情:
<input type="text" ng-enter="this.blur()">
或者如何将当前元素作为参数传递?
<input type="text" ng-enter="doBlur(this)">
答案 0 :(得分:25)
在尝试了很多东西之后,这似乎是不可能的,因为你需要传递$ event来获取目标元素,所以单独的指令似乎是唯一的方法:
我们的愿望:
您无法传递this
,因为它引用了范围,因此您需要传递该事件。
<input type="text" ng-enter="doBlur($event)">
一旦你有了这个事件,就可以从中获得目标。
$scope.doBlur = function($event){
var target = $event.target;
// do more here, like blur or other things
target.blur();
}
但是,你只能在像ng-click这样的指令中获得传递事件......有点不满意。如果我们可以传递$ event outside指令,我们可能会以您请求的可重用方式模糊。
答案 1 :(得分:4)
SoluableNonagon 非常接近它。你只需要使用正确的参数。该指令将事件参数声明为event
而不是$event
。你可以像$event
那样更改指令以使用ngClick
(或者保留它并将其用作ng-enter="doSomething(event)"
。
angular.module("app", [])
.controller('MainController', MainController)
.directive('myEnter', myEnter);
function MainController() {
var vm = this;
vm.text = '';
vm.enter = function($event) {
$event.target.blur();
vm.result = vm.text;
vm.text = '';
}
}
myEnter.$inject = ['$parse'];
function myEnter($parse) {
return {
restrict: 'A',
compile: function($element, attr) {
var fn = $parse(attr.myEnter, null, true);
return function(scope, element) {
element.on("keydown keypress", function(event) {
if (event.which === 13) {
// This will pass event where the expression used $event
fn(scope, { $event: event });
scope.$apply();
event.preventDefault();
}
});
};
}
};
}
<script src="https://code.angularjs.org/1.4.8/angular.js"></script>
<div ng-app="app" ng-controller="MainController as view">
<input my-enter="view.enter($event)" ng-model="view.text">
<div ng-bind="view.result"></div>
</div>
答案 2 :(得分:1)
适用于Angular 2+
<input ... (keydown.enter)='$event.target.blur()'>