2016-02-04 94 views
1

的广播事件后未在视图中更新我已经阅读过类似的问题,我无法指出为什么这不会更新。我可以在catch事件上获取范围变量的日志。但它没有更新视图。所以它填充“测试”,但不会更新$ 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> 

为视图控制器由路径提供程序时加载的部分所指示的视图。

.when('/feed/:url', { 
      templateUrl: '/templates/eventWall-feed', 
      controller: 'eventWallFeedController' 
     }) 

回答

4

$on$broadcast不叫$apply因此,你需要在$apply

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

谢谢。真正搞砸了我的是我从另一个问题得到了指令片断。它只是毁了我为什么不能更新。为什么其他$ scope变量会被更新。就像在ajax调用的回调函数中,我可以更新.then函数中的$ scope变量,并且它会更新。但在这里我必须打电话给$ apply? –

+0

我觉得因为$ broadcast和$ on有可能被多次运行,并且如果它每次都运行一个摘要循环,将会妨碍性能。这是我最好的猜测。 – Ronnie

1

你可以尝试添加$范围包裹$scope.keypPressed。$适用()的按键功能结束。

相关问题