在这种特殊情况下,当我按 Enter 时,我必须使用哪些选项才能使这些输入调用函数?
html:
<form>
<input type="text" ng-model="name" <!-- Press ENTER and call myFunc --> />
<br />
<input type="text" ng-model="email" <!-- Press ENTER and call myFunc --> />
</form>
// Controller //
.controller('mycontroller', ['$scope',function($scope) {
$scope.name = '';
$scope.email = '';
// Function to be called when pressing ENTER
$scope.myFunc = function() {
alert('Submitted');
};
}])
Angular 开箱即用地支持这一点。您是否在表单元素上尝试过 ngSubmit?
<form ng-submit="myFunc()" ng-controller="mycontroller">
<input type="text" ng-model="name" />
<br />
<input type="text" ng-model="email" />
</form>
编辑:根据有关提交按钮的评论,请参阅Submitting a form by pressing enter without a submit button,它提供了以下解决方案:
<input type="submit" style="position: absolute; left: -9999px; width: 1px; height: 1px;"/>
如果您不喜欢隐藏提交按钮的解决方案,则需要将控制器功能绑定到 Enter 按键或 keyup 事件。这通常需要一个自定义指令,但 AngularUI 库已经设置了一个很好的按键解决方案。请参阅http://angular-ui.github.com/
添加 angularUI 库后,您的代码将类似于:
<form ui-keypress="{13:'myFunc($event)'}">
... input fields ...
</form>
或者您可以将回车键绑定到每个单独的字段。
此外,请参阅此 SO 问题以创建简单的 keypres 指令:How can I detect onKeyUp in AngularJS?
编辑(2014-08-28):在编写此答案时,ng-keypress/ng-keyup/ng-keydown 在 AngularJS 中不作为本机指令存在。在下面的评论中@darlan-alves 有一个很好的解决方案:
<input ng-keyup="$event.keyCode == 13 && myFunc()"... />
如果你想调用没有表单的函数,你可以使用我的 ngEnter 指令:
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>
我在 my twitter 和我的 gist account 上提交了其他很棒的指令。
keydown
和 keypress
事件而不用逗号分隔它们意味着两者可以同时触发。这可能会产生 $rootScope:inprog 错误。在它们之间添加一个逗号会创建一个析取词,并确保只发生 $digest 循环。无法应用编辑,因为它只有一个字符。
如果您只有一个输入,则可以使用表单标签。
<form ng-submit="myFunc()" ...>
如果您有多个输入,或者不想使用表单标签,或者想将输入键功能附加到特定字段,则可以将其内联到特定输入,如下所示:
<input ng-keyup="$event.keyCode == 13 && myFunc()" ...>
我想要一些比给定答案更具可扩展性/语义的东西,所以我编写了一个指令,该指令以与内置 ngClass
类似的方式采用 javascript 对象:
HTML
<input key-bind="{ enter: 'go()', esc: 'clear()' }" type="text"></input>
对象的值在指令范围的上下文中进行评估 - 确保它们用单引号括起来,否则所有函数将在指令加载时执行(!)
例如:esc : 'clear()'
而不是 esc : clear()
Javascript
myModule
.constant('keyCodes', {
esc: 27,
space: 32,
enter: 13,
tab: 9,
backspace: 8,
shift: 16,
ctrl: 17,
alt: 18,
capslock: 20,
numlock: 144
})
.directive('keyBind', ['keyCodes', function (keyCodes) {
function map(obj) {
var mapped = {};
for (var key in obj) {
var action = obj[key];
if (keyCodes.hasOwnProperty(key)) {
mapped[keyCodes[key]] = action;
}
}
return mapped;
}
return function (scope, element, attrs) {
var bindings = map(scope.$eval(attrs.keyBind));
element.bind("keydown keypress", function (event) {
if (bindings.hasOwnProperty(event.which)) {
scope.$apply(function() {
scope.$eval(bindings[event.which]);
});
}
});
};
}]);
'vm.doTheThing("myVar")'
另一种方法是使用 ng-keypress ,
<input type="text" ng-model="data" ng-keypress="($event.charCode==13)? myfunc() : return">
Submit an input on pressing Enter with AngularJS - jsfiddle
非常好的、干净和简单的指令,带有 shift + enter 支持:
app.directive('enterSubmit', function () {
return {
restrict: 'A',
link: function (scope, elem, attrs) {
elem.bind('keydown', function(event) {
var code = event.keyCode || event.which;
if (code === 13) {
if (!event.shiftKey) {
event.preventDefault();
scope.$apply(attrs.enterSubmit);
}
}
});
}
}
});
如果你也想要数据验证
<!-- form -->
<form name="loginForm">
...
<input type="email" ng-keyup="$loginForm.$valid && $event.keyCode == 13 && signIn()" ng-model="email"... />
<input type="password" ng-keyup="$loginForm.$valid && $event.keyCode == 13 && signIn()" ng-model="password"... />
</form>
这里重要的补充是 $loginForm.$valid
,它将在执行函数之前验证表单。您将不得不添加其他属性进行验证,这超出了此问题的范围。
祝你好运。
只是想指出,在有隐藏提交按钮的情况下,您可以使用 ngShow 指令并将其设置为 false,如下所示:
HTML
<form ng-submit="myFunc()">
<input type="text" name="username">
<input type="submit" value="submit" ng-show="false">
</form>
<button ng-show="false"></button>
更短。无需设置不可见按钮的值。
type="submit"
...我想可以忽略 value,但我相信前者是必要的。
使用 ng-submit 并将两个输入包装在单独的表单标签中:
<div ng-controller="mycontroller">
<form ng-submit="myFunc()">
<input type="text" ng-model="name" <!-- Press ENTER and call myFunc --> />
</form>
<br />
<form ng-submit="myFunc()">
<input type="text" ng-model="email" <!-- Press ENTER and call myFunc --> />
</form>
</div>
将每个输入字段包装在其自己的表单标记中允许 ENTER 在任一表单上调用提交。如果您对两者都使用一个表单标签,则必须包含一个提交按钮。
使用 CSS 类而不是重复内联样式会稍微整洁一些。
CSS
input[type=submit] {
position: absolute;
left: -9999px;
}
HTML
<form ng-submit="myFunc()">
<input type="text" ng-model="name" />
<br />
<input type="text" ng-model="email" />
<input type="submit" />
</form>
FWIW - 这是我用于基本确认/警报引导模式的指令,不需要 <form>
(只需将 jQuery click 操作切换为您喜欢的任何内容,并将 data-easy-dismiss
添加到您的模态标签)
app.directive('easyDismiss', function() {
return {
restrict: 'A',
link: function ($scope, $element) {
var clickSubmit = function (e) {
if (e.which == 13) {
$element.find('[type="submit"]').click();
}
};
$element.on('show.bs.modal', function() {
$(document).on('keypress', clickSubmit);
});
$element.on('hide.bs.modal', function() {
$(document).off('keypress', clickSubmit);
});
}
};
});
您可以简单地将 @Hostlistener 与组件绑定,其余的将由它来处理。它不需要绑定其 HTML 模板中的任何方法。
@HostListener('keydown',['$event'])
onkeydown(event:keyboardEvent){
if(event.key == 'Enter'){
// TODO do something here
// form.submit() OR API hit for any http method
}
}
上面的代码应该适用于 Angular 1+ 版本
ng-submit="join()"
用于具有$scope.join = function() {...}
的注册控制器并将该函数名称更改为foo()
使输入按钮提交再次工作。ng-keyup="$event.keyCode == 13 && myFunc()"
真棒 :)