按Enter键inputAngularJS提交表单
在这种特殊情况下,当我按Enter键时,有什么选项可以使这些input调用一个函数?
// HTML view // <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>
编辑:根据有关提交button的评论,请参阅提交表单,按enter不提交button ,提供的解决scheme:
<input type="submit" style="position: absolute; left: -9999px; width: 1px; height: 1px;"/>
如果您不喜欢隐藏的提交button解决scheme,则需要将控制器function绑定到Enter键或键盘事件。 这通常需要一个自定义指令,但AngularUI库已经build立了一个很好的按键解决scheme。 见http://angular-ui.github.com/
在添加了angularUI库之后,你的代码会是这样的:
<form ui-keypress="{13:'myFunc($event)'}"> ... input fields ... </form>
或者您可以将input按键绑定到每个单独的字段。
另外,请参阅以下有关创build简单的keypres指令的问题: 如何在AngularJS中检测onKeyUp?
编辑(2014-08-28):在写这个答案的时候,ng-keypress / ng-keyup / ng-keydown在AngularJS中并不存在。 在下面的评论@达兰阿尔维斯有一个相当不错的解决scheme:
<input ng-keyup="$event.keyCode == 13 && myFunc()"... />
如果你想调用没有forms的函数,你可以使用我的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>
我在我的twitter和我的要求提交其他真棒指令。
如果你只有一个input,你可以使用表单标签。
<form ng-submit="myFunc()" ...>
如果您有多个input,或者不想使用表单标签,或者想要将input键function附加到特定字段,则可以将其内联到特定input,如下所示:
<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]); }); } }); }; }]);
非常好,干净,简单的指令与Shift +input支持:
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); } } }); } } });
另一种方法是使用ng-keypress,
<input type="text" ng-model="data" ng-keypress="($event.charCode==13)? myfunc() : return">
按下AngularJS的input提交input – jsfiddle
如果你想要数据validation
<!-- 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
,它将在执行函数之前validation表单。 您将不得不添加其他属性进行validation,这超出了这个问题的范围。
祝你好运。
只是想指出,在隐藏提交button的情况下,你可以使用ngShow指令,并将其设置为false,如下所示:
HTML
<form ng-submit="myFunc()"> <input type="text" name="username"> <input type="submit" value="submit" ng-show="false"> </form>
使用ng-submit并将两个input封装在单独的表单标签中:
<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>
用自己的表单标签包装每个input字段允许ENTER调用任何一种forms的提交。 如果您同时使用一个表单标签,则必须包含一个提交button。
稍微整洁的使用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点击操作转换为任何你喜欢的,并添加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); }); } }; });