Angularjs 为什么在Angular中,`keydown`函数内的$scope更改没有更新DOM

Angularjs 为什么在Angular中,`keydown`函数内的$scope更改没有更新DOM,angularjs,Angularjs,根据下面的控制器,我认为按下左键时,应出现和ngShow $scope会进行更新(可以将其视为打印到控制台),但DOM不会更改 但是当我在输入字段中键入某个内容时,就会出现。所以它就像angular没有注意我用keydown所做的更改一样 控制器 .controller('TestCtrl', ['$scope', '$document', function($scope, $document) { var keyboardMap = { 37: 'left'}; $docume

根据下面的控制器,我认为按下
左键时,应出现
ngShow

$scope
会进行更新(可以将其视为打印到控制台),但DOM不会更改

但是当我在
输入
字段中键入某个内容时,
就会出现。所以它就像angular没有注意我用
keydown
所做的更改一样

控制器

.controller('TestCtrl', ['$scope', '$document', function($scope, $document) {
    var keyboardMap = { 37: 'left'};
    $document.on('keydown', function (event) {
        var key = keyboardMap[event.which];
        if (key) {
            console.log('lefty');
            $scope.left = true;
        } 
    });
}]);
查看

<div ng-app="TestApp" ng-controller="TestCtrl">
    <div ng-show="left" style="height: 100px; width: 100px; border: 1px black solid;"></div>
    <input ng-model="something"></input>
</div>

我读了一些其他类似的问题,但没有发现它们有帮助。我确实觉得这里有些东西我不明白


有人知道它为什么不更新吗?我如何使它更新?

将代码包装在
$apply
块中:

if (key) {
            console.log('lefty');
            $scope.$apply(function() {
                $scope.left = true;
            });
        } 
这将强制从angulars世界之外的事件更新模型


编辑:
$scope.$digest()
是另一种方法。有关差异的解释。

将代码包装在
$apply
块中:

if (key) {
            console.log('lefty');
            $scope.$apply(function() {
                $scope.left = true;
            });
        } 
这将强制从angulars世界之外的事件更新模型


编辑:
$scope.$digest()
是另一种方法。有关差异的解释。

请执行
$digest()
,因为AngularJS对
事件的
一无所知

函数TestCtrl($scope,$document){
$document.on('keydown',函数(事件){
var键盘映射={
37:‘左’
};
var key=keyboardMap[event.which];
如果(关键){
$scope.left=true;
$scope.$digest()
}
});
}

请执行
$digest()
,因为AngularJS对
事件的
一无所知

函数TestCtrl($scope,$document){
$document.on('keydown',函数(事件){
var键盘映射={
37:‘左’
};
var key=keyboardMap[event.which];
如果(关键){
$scope.left=true;
$scope.$digest()
}
});
}