我有一个控制器注入$document
以捕获keydown
事件。
但是这个事件总是一个关键时刻。
我使用$broadcast
ng-keydown
中<body>
的另一种方法可以正常工作。
我的问题是:$document.on('keydown', ...)
出了什么问题?
这是一个有效的例子:
<body ng-app="app" ng-keydown="$broadcast('mykeydown', $event);">
<div ng-controller="BroadcastController">
key down by broadcast: {{keycode}}
</div>
<div ng-controller="KeyFromDocController">
key down from $document : {{keycode}} <br>[always one late !!!]
</div>
</body>
<script>
angular.module('app', [])
.controller('BroadcastController', function($scope) {
$scope.keycode = '?';
$scope.$on('mykeydown',function(msg,evt) {
$scope.keycode = evt.which;
});
})
.controller('KeyFromDocController', function($scope,$document) {
$scope.keycode = '?';
$document.on('keydown',function(evt) {
$scope.keycode = evt.which;
});
});
</script>
答案 0 :(得分:4)
如果你这样做,你不应该,那就不会像你说的那样“迟到”:
$document.on('keydown',function(evt) {
$scope.keycode = evt.which;
$scope.$apply();
});
在Angular中,您不应该从控制器执行这些操作,但是从指令,DOM操作和DOM事件属于指令,具体到指令的link
函数。
当您注册这样的事件时会发生什么事情是您在控制器内注册事件,但是当事件获得触发的角度时对该功能一无所知,因此您必须致电$apply
为了触发将重新评估和刷新视图表达式的$diggest
周期。