如何检测 angular.js 中的 keydown 或 keypress 事件?

Posted

技术标签:

【中文标题】如何检测 angular.js 中的 keydown 或 keypress 事件?【英文标题】:How can I detect keydown or keypress event in angular.js? 【发布时间】:2013-08-23 23:43:58 【问题描述】:

我正在尝试获取手机号码文本框的值,以使用 angular.js 验证其输入值。我是使用 angular.js 的新手,不太确定如何实现这些事件并放置一些 javascript 来验证或操作我的 html 代码中的表单输入。

这是我的 HTML:

    <div>
        <label for="mobile_number">Mobile Number</label>
        <input type="text" id="mobile_number" placeholder="+639178983214" required
           ngcontroller="RegisterDataController" ng-keydown="keydown">
    </div> 

还有我的控制器:

    function RegisterDataController($scope, $element) 
       console.log('register data controller');
       console.log($element);
       $scope.keydown = function(keyEvent) 
        console.log('keydown -'+keyEvent);
       ;
    

我不知道如何在 angular.js 中使用 keydown 事件,我也搜索了如何正确使用它。我可以验证我对指令的输入吗?或者我应该像我所做的那样使用控制器来使用 keydown 或 keypress 之类的事件?

【问题讨论】:

【参考方案1】:

更新:

ngKeypressngKeydownngKeyup 现在是 AngularJS 的一部分。

<!-- you can, for example, specify an expression to evaluate -->
<input ng-keypress="count = count + 1" ng-init="count=0">

<!-- or call a controller/directive method and pass $event as parameter.
     With access to $event you can now do stuff like 
     finding which key was pressed -->
<input ng-keypress="changed($event)">

在这里阅读更多:

https://docs.angularjs.org/api/ng/directive/ngKeypress https://docs.angularjs.org/api/ng/directive/ngKeydown https://docs.angularjs.org/api/ng/directive/ngKeyup

早期的解决方案:

解决方案 1:使用 ng-changeng-model

<input type="text" placeholder="+639178983214" ng-model="mobileNumber" 
ng-controller="RegisterDataController" ng-change="keydown()">

JS:

function RegisterDataController($scope)        
   $scope.keydown = function() 
        /* validate $scope.mobileNumber here*/
   ;

解决方案 2. 使用$watch

<input type="text" placeholder="+639178983214" ng-model="mobileNumber" 
ng-controller="RegisterDataController">
    

JS:

$scope.$watch("mobileNumber", function(newValue, oldValue) 
    /* change noticed */
);

【讨论】:

使用迄今为止的最新稳定版本 (1.0.8)【参考方案2】:

您可以查看 Angular UI @http://angular-ui.github.io/ui-utils/,它提供了用于检测 keydown、keyup、keypress 的详细事件句柄回调函数 (还有 Enter 键、退格键、alter 键、控制键)

<textarea ui-keydown="27:'keydownCallback($event)'"></textarea>
<textarea ui-keypress="13:'keypressCallback($event)'"></textarea>
<textarea ui-keydown="'enter alt-space':'keypressCallback($event)'"> </textarea>
<textarea ui-keyup="'enter':'keypressCallback($event)'"> </textarea>

【讨论】:

【参考方案3】:

您的“ng-keydown”属性输入正确,但您错过了一个简单的步骤。仅仅因为您将 ng-keydown 属性放在那里,并不意味着 Angular 知道如何处理它。这就是“指令”发挥作用的地方。您正确使用了该属性,但是您现在需要编写一个指令,该指令将告诉 Angular 当它在 html 元素上看到该属性时要做什么。

以下是您将如何执行此操作的示例。我们将把指令从 ng-keydown 重命名为 on-keydown(以避免违反 here 的“最佳实践”):

var mod = angular.module('mydirectives');
mod.directive('onKeydown', function() 
    return 
        restrict: 'A',
        link: function(scope, elem, attrs) 
             // this next line will convert the string
             // function name into an actual function
             var functionToCall = scope.$eval(attrs.ngKeydown);
             elem.on('keydown', function(e)
                  // on the keydown event, call my function
                  // and pass it the keycode of the key
                  // that was pressed
                  // ex: if ENTER was pressed, e.which == 13
                  functionToCall(e.which);
             );
        
    ;
);

指令 simple 告诉 Angular,当它看到一个名为“ng-keydown”的 HTML 属性时,它应该监听具有该属性的元素并调用传递给它的任何函数。在 html 中,您将拥有以下内容:

<input type="text" on-keydown="onKeydown">

然后在您的控制器中(就像您已经拥有的一样),您将向控制器的范围添加一个名为“onKeydown”的函数,如下所示:

$scope.onKeydown = function(keycode)
    // do something with the keycode

希望对您或其他想了解的人有所帮助

【讨论】:

指令名称不会是 'ng-keydown' 吗? 正如here 解释的那样,指令名称是标准化的。这意味着如果您希望您的 html 属性为ng-my-attribute,您可以将指令名称写为'ngMyAttribute。每个大写字母都将小写并以- 开头。这在 javascript 中很常见,因为它允许将连字符字符串用作 javascript 对象中的键。 你不应该用 ng 前缀来命名你的指令。对于有角度的书面指令,这是“保留的”。但是,最好使用您自己的前缀。 确实如此。我只是想让它变得简单,但我会编辑答案以避免任何混淆。【参考方案4】:

使用 ng-controller 的 JavaScript 代码:

$scope.checkkey = function (event) 
  alert(event.keyCode);  //this will show the ASCII value of the key pressed

在 HTML 中:

<input type="text" ng-keypress="checkkey($event)" />

您现在可以使用 keyCode 方法放置支票和其他条件。

【讨论】:

以上是关于如何检测 angular.js 中的 keydown 或 keypress 事件?的主要内容,如果未能解决你的问题,请参考以下文章

检测在 Angular.js ng-change 事件中复选框是选中还是未选中

如何使用角度检测浏览器后退按钮单击事件?

如何在 angular.js 中解析 ng-repeat 中的 HTML [重复]

如何在Angular js中的http请求中发送标头数据

angular.js 中的 Django formset 等效项

从另一个页面添加数据库(couchbase)中的项目后,如何从 angular.js 中的页面更新列表?