我完全困惑为什么我的按键事件处理程序始终是一个键击。 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源中看到任何这种效果。
答案 0 :(得分:6)
您应该使用ng-keyup
。 Keypress可能并不总是按预期工作。
来自jQuery文档:
注意:由于任何官方规范都没有涵盖按键事件,因此使用它时遇到的实际行为可能因浏览器,浏览器版本和平台而异。
答案 1 :(得分:1)
因为您的示例中的事件目标是一个输入元素,并且该元素尚未处理击键,因此该元素的value
始终是一个键击滞后。这使事件处理程序有机会拒绝按键。
您可以通过查看事件对象的which
字段来检查按下的键值。