为什么$ document.on('keydown')迟到了?

时间:2014-09-30 20:27:17

标签: javascript angularjs keydown onkeydown

我有一个控制器注入$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>

你可以在这里测试http://plnkr.co/edit/omhTiLi31BnEwrSwk75A

1 个答案:

答案 0 :(得分:4)

如果你这样做,你不应该,那就不会像你说的那样“迟到”:

  $document.on('keydown',function(evt) {
    $scope.keycode = evt.which;
    $scope.$apply();
  });

Example

在Angular中,您不应该从控制器执行这些操作,但是从指令,DOM操作和DOM事件属于指令,具体到指令的link函数。

当您注册这样的事件时会发生什么事情是您在控制器内注册事件,但是当事件获得触发的角度时对该功能一无所知,因此您必须致电$apply为了触发将重新评估和刷新视图表达式的$diggest周期。