为什么我的事件处理程序总是一个键击,$ timeout如何解决这个问题?

时间:2014-01-17 19:19:28

标签: angularjs angularjs-directive

我完全困惑为什么我的按键事件处理程序始终是一个键击。 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源中看到任何这种效果。

2 个答案:

答案 0 :(得分:6)

您应该使用ng-keyup。 Keypress可能并不总是按预期工作。

来自jQuery文档:

注意:由于任何官方规范都没有涵盖按键事件,因此使用它时遇到的实际行为可能因浏览器,浏览器版本和平台而异。

答案 1 :(得分:1)

因为您的示例中的事件目标是一个输入元素,并且该元素尚未处理击键,因此该元素的value始终是一个键击滞后。这使事件处理程序有机会拒绝按键。

您可以通过查看事件对象的which字段来检查按下的键值。