我完全困惑为什么我的按键事件处理程序始终是一个键击.
http://plnkr.co/edit/w3FAXGd5zjrktO6DgOpD?p=preview
<body ng-controller="myController"> <form> <input ng-keypress="handleKeypress($event)" /> </form> </body>
控制器:
myapp.controller('myController',function($scope,$timeout){ $scope.handleKeypress = function(ev){ console.log(ev.target.value); //always one keystroke behind //$timeout(function(){console.log(ev.target.value);}); //works! }; });
为什么需要$timeout以及为什么/如何工作? (新手友好的答案更可取)
我理解,使用keypress事件时,角色尚未插入到DOM中,但我很困惑,因为angularjs.org的Hello World示例在释放密钥之前响应.他们的示例不使用自定义事件处理程序,但显然Angular在keyup事件之前更新了模型,所以我想了解更多关于在自定义事件处理程序中执行此操作的信息.
idursun的回答指出event.which在keypress上可用,我认为Angular可能正在使用String.fromCharCode(),但我没有在Angular源中看到任何关于此效果的内容.
解决方法
因为您的示例中的事件目标是一个输入元素,并且该元素尚未处理击键,因此该元素的值始终是一个键击滞后.这使事件处理程序有机会拒绝按键.
您可以通过查看事件对象的哪个字段来检查按下的键值.