My keypress обработчик события всегда одно нажатие клавиши и как-то $timeout
исправляет это.
<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, но я смущен, потому что пример Hello World в angularjs.org отвечает перед тем, как ключ будет выпущен.
(Их пример не использует пользовательский обработчик событий, но явно Угловая обновляет модель перед keyup
события, поэтому я хотел бы понять больше об этом в обработчике пользовательского события.)
event.which
доступен на keypress
и keydown
, и я подумал, что, возможно, Angular может использовать String.fromCharCode()
, но я не вижу ничего в этом угловом источнике.
$ таймаут заставляет дайджеста случиться. Хотя ng-keypress также должен вызвать дайджест, поэтому я не уверен, почему это один удар позади. Есть ли больше кода, который вы не публикуете? –
Я думаю, что это проблема с событием onkeypress, проверьте следующее: http://stackoverflow.com/questions/9349587/javascript-onkeypress-event-fires-but-input-text-value-is-incorrect, http: // stackoverflow .com/questions/5340751/javascript-last-character-missing-on-onkeypress-event –