如何在AngularJS中使用按键事件?

Ven*_*ata 404 angularjs angular-ui angularjs-directive

我想在下面的文本框中捕获回车键按下事件.为了更清楚,我使用a ng-repeat来填充tbody.这是HTML:

<td><input type="number" id="closeqty{{$index}}" class="pagination-right closefield" 
    data-ng-model="closeqtymodel" data-ng-change="change($index)" required placeholder="{{item.closeMeasure}}" /></td>
Run Code Online (Sandbox Code Playgroud)

这是我的模块:

angular.module('components', ['ngResource']);
Run Code Online (Sandbox Code Playgroud)

我正在使用资源填充表,我的控制器代码是:

function Ajaxy($scope, $resource) {
//controller which has resource to populate the table 
}
Run Code Online (Sandbox Code Playgroud)

Epo*_*okK 804

你需要添加一个directive,像这样:

Javascript:

app.directive('myEnter', function () {
    return function (scope, element, attrs) {
        element.bind("keydown keypress", function (event) {
            if(event.which === 13) {
                scope.$apply(function (){
                    scope.$eval(attrs.myEnter);
                });

                event.preventDefault();
            }
        });
    };
});
Run Code Online (Sandbox Code Playgroud)

HTML:

<div ng-app="" ng-controller="MainCtrl">
    <input type="text" my-enter="doSomething()">    
</div>
Run Code Online (Sandbox Code Playgroud)

  • 另请注意,建议不要使用ng前缀,因为这可能与将来的ng-*指令冲突.请改用自己的 (59认同)
  • @DerekAdair该指令绑定到它所归属的元素的`keydown`和`keypress`事件.收到事件时,在`$ apply`块中评估提供的表达式. (7认同)
  • 更安全地定义这样的键:```var key = typeof event.which ==="undefined"?event.keyCode:event.which;```只要event.which没有被每个浏览器使用.请参阅此处的评论:http://stackoverflow.com/a/4471635/2547632 (7认同)
  • 我还会在绑定测试中添加`keyup` (3认同)
  • 别忘了破坏你的绑定:**范围.$ on('$ destroy',function(){element.unbind('keydown');})** (3认同)
  • 这是最好的解决方案,因为它保持视图和控制器分离. (2认同)
  • 为什么他绑定`keydown`和`keypress`.使用`keypress`还不够吗? (2认同)
  • 更新指令在这里https://gist.github.com/singhmohancs/317854a859098bffe9477f59eac8d915 (2认同)

小智 341

另一种方法是使用标准指令 ng-keypress="myFunct($event)"

然后在您的控制器中,您可以:

...

$scope.myFunct = function(keyEvent) {
  if (keyEvent.which === 13)
    alert('I am an alert');
}

...
Run Code Online (Sandbox Code Playgroud)

  • 为了节省其他人一些时间,`ng-keypress`似乎不是角度1.0.x的一部分,`ui-keypress`(具有稍微不同的调用语义)可用:http://angular-ui.github .IO/UI-utils的/ (18认同)
  • 最佳答案+1.如果有一个已经包含在Angular中的指令,我为什么要制作自己的指令呢? (6认同)
  • 更好的是,使用ngKeypress并将$ event传递给自定义过滤器. (5认同)

Eri*_*hen 171

我最简单的方法是使用角度内置指令:

ng-keypress,ng-keydownng-keyup.

通常,我们希望为已经通过ng-click处理的内容添加键盘支持.

例如:

<a ng-click="action()">action</a>
Run Code Online (Sandbox Code Playgroud)

现在,让我们添加键盘支持.

按Enter键触发:

<a ng-click="action()" 
   ng-keydown="$event.keyCode === 13 && action()">action</a>
Run Code Online (Sandbox Code Playgroud)

按空格键:

<a ng-click="action()" 
   ng-keydown="$event.keyCode === 32 && action()">action</a>
Run Code Online (Sandbox Code Playgroud)

按空格或输入键:

<a ng-click="action()" 
   ng-keydown="($event.keyCode === 13 || $event.keyCode === 32) && action()">action</a>
Run Code Online (Sandbox Code Playgroud)

如果你在现代浏览器

<a ng-click="action()" 
   ng-keydown="[13, 32].includes($event.keyCode) && action()">action</a>
Run Code Online (Sandbox Code Playgroud)

有关keyCode的更多信息:
keyCode已被弃用但受到良好支持的API,您可以在支持的浏览器中使用$ evevt.key.
有关详细信息,请参阅https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key

  • "像IE9这样的老浏览器"......从未想过这一天会来:) (2认同)

Rod*_*ira 102

另一种简单的选择

<input ng-model="edItem" type="text" 
    ng-keypress="($event.which === 13)?foo(edItem):0"/>
Run Code Online (Sandbox Code Playgroud)

和ng-ui替代方案:

<input ng-model="edItem" type="text" ui-keypress="{'enter':'foo(edItem)'}"/>
Run Code Online (Sandbox Code Playgroud)

  • ng-ui它不明确,相反你应该说"UI.Utils"或分享链接:http://angular-ui.github.io/ui-utils/ (9认同)

小智 19

这是我在构建具有类似要求的应用程序时所想到的,它不需要编写指令,而且它的相关性很简单:

<input type="text" ng-keypress="($event.charCode==13)?myFunction():return" placeholder="Will Submit on Enter">
Run Code Online (Sandbox Code Playgroud)

  • 简单有效. (3认同)

小智 15

您可以使用ng-keydown ="myFunction($ event)"作为属性.

<input ng-keydown="myFunction($event)" type="number">

myFunction(event) {
    if(event.keyCode == 13) {   // '13' is the key code for enter
        // do what you want to do when 'enter' is pressed :)
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 6

html

<textarea id="messageTxt" 
    rows="5" 
    placeholder="Escriba su mensaje" 
    ng-keypress="keyPressed($event)" 
    ng-model="smsData.mensaje">
</textarea>
Run Code Online (Sandbox Code Playgroud)

控制器.js

$scope.keyPressed = function (keyEvent) {
    if (keyEvent.keyCode == 13) {
        alert('presiono enter');
        console.log('presiono enter');
    }
};
Run Code Online (Sandbox Code Playgroud)