Javascript $scope变量在指令的广播事件后未在视图中更新

Javascript $scope变量在指令的广播事件后未在视图中更新,javascript,angularjs,ejs,angular-directive,Javascript,Angularjs,Ejs,Angular Directive,我读过类似的问题,但我无法解释为什么这篇文章没有更新。我可以获取范围变量更新catch事件的日志。但它并没有更新视图。因此,它会填充“test”,但在更新$scope.keyPressed时不会更新 指令 app.directive('keypressEvents', [ '$document', '$rootScope', function($document, $rootScope) { return { restrict: 'A', link:

我读过类似的问题,但我无法解释为什么这篇文章没有更新。我可以获取范围变量更新catch事件的日志。但它并没有更新视图。因此,它会填充“test”,但在更新$scope.keyPressed时不会更新

指令

app.directive('keypressEvents', [
  '$document',
  '$rootScope',
  function($document, $rootScope) {
    return {
      restrict: 'A',
      link: function() {
        $document.bind('keypress', function(e) {
          console.log('Got keypress:', e.which);
          // console.log('document', $document)
          $rootScope.$broadcast('keypress', e);
          $rootScope.$broadcast('keypress:' + e.which, e);
        });
      }
    };
  }
]);
控制器

$scope.keyPressed = 'test';
$scope.$on('keypress:13', function(onEvent, keypressEvent) {
          $scope.keyPressed = 'Enter';
          console.log($scope.keyPressed);
        });
        // For listening to all keypress events
        $scope.$on('keypress', function(onEvent, keypressEvent) {
          if (keypressEvent.which === 120) {
            $scope.keyPressed = 'x';
          }
          else {
            console.log('else' ,keypressEvent);
            $scope.keyPressed = 'Keycode: ' + keypressEvent.which;
          }
        });
景色

<div data-keypress-events>
    {{keyPressed}}
</div>

$on
$broadcast
不调用
$apply
,因此需要在
$apply
中包装
$scope.keypPressed
,如

$scope.$apply(function() {
  $scope.keyPressed = 'x';
});

$on
$broadcast
不调用
$apply
,因此需要在
$apply
中包装
$scope.keypPressed
,如

$scope.$apply(function() {
  $scope.keyPressed = 'x';
});

您可以尝试将$scope.$apply()添加到keypress函数的结尾。

您可以尝试将$scope.$apply()添加到keypress函数的结尾。

谢谢。真正让我困惑的是,我从另一个问题中得到了指令片段。它毁了我为什么它不能更新。为什么要更新其他$scope变量。就像在ajax调用的回调中一样,我可以更新.then函数上的$scope变量,然后它就会更新。但这里我必须调用$apply?我认为,因为$broadcast和$on可能会运行多次,如果每次都运行摘要循环,则会影响性能。这是我最好的猜测。谢谢。真正让我困惑的是,我从另一个问题中得到了指令片段。它毁了我为什么它不能更新。为什么要更新其他$scope变量。就像在ajax调用的回调中一样,我可以更新.then函数上的$scope变量,然后它就会更新。但这里我必须调用$apply?我认为,因为$broadcast和$on可能会运行多次,如果每次都运行摘要循环,则会影响性能。这是我最好的猜测。