Javascript 告诉Angular不要刷新视图

Javascript 告诉Angular不要刷新视图,javascript,angularjs,angularjs-scope,Javascript,Angularjs,Angularjs Scope,我正在构建一个有角度的应用程序 我需要收听onKeyDown事件(尤其是ESC事件),以便关闭侧栏。 但当我这样做的时候,似乎每次按下一个键都会刷新视图,这很烦人,因为我的页面上有随机的颜色,每次都会改变 index.html: ... 在js中: $rootScope.onKeyDown=函数($event){ 如果($event.keyCode==27){ $rootScope.sidebar=false } /* 否则{ //请不要刷新范围 } */ } 这是否正常,以及如何避免在没

我正在构建一个有角度的应用程序

我需要收听
onKeyDown
事件(尤其是ESC事件),以便关闭侧栏。 但当我这样做的时候,似乎每次按下一个键都会刷新视图,这很烦人,因为我的页面上有随机的颜色,每次都会改变

index.html:


...
在js中:

$rootScope.onKeyDown=函数($event){
如果($event.keyCode==27){
$rootScope.sidebar=false
}
/*
否则{
//请不要刷新范围
}
*/
}

这是否正常,以及如何避免在没有任何更改时刷新页面?

禁用默认事件,该事件在每次使用键盘敲击时触发$scope摘要

//这将禁用触发摘要的输入
//手动检查并触发$digest
$scope.update=函数(e){
如果(e.keyCode==27){
$scope.$digest();
}
} 
如果您希望全局执行此操作,则需要配置应用程序(而不是将ng模型选项应用于页面上的每个输入)。看


当然有更优雅的解决方案,但它们需要大量的源潜水和忍者技能。因此,人们会对Angular感到沮丧。

我没有使用
ng keydown
attr,而是在
app.run()
中的
$document
事件上切换到binding
keydown
,它:

  • 作品及
  • 我认为在车身上添加
    ng keydown
    更干净

  • Angular的最佳实践要求ViewModel属性的getter快速且幂等。您的随机颜色不应在每次出现$digest时刷新cycle@NewDev,我同意这不是最佳实践,但它是最简单的:
    style=“background:{{{color()}}”
    。我不知道如何做,否则(它必须是js端,没有css)。这很好。我的意思是无论调用多少次,
    color()
    都应该返回相同的值。如果这不起作用,请创建另一个方法,如
    lastGeneratedColor()
    。我目前的解决方案是:
    color()
    只返回存储在列表中的随机字符串值,而不执行其他操作<代码>返回颜色[Math.floor(Math.random()*colors.length)]我会保持原样。谢谢嗨@JohnStrickler,它似乎不起作用,因为我是在身体元素上做的。这里是我的身体标签:
    这个版本也不起作用:
    // This disables the INPUT from triggering digests 
    <input ng-model="someModel" ng-model-options="{updateOn:''}" ng-keydown="update($event)">
    
    // manually check and trigger a $digest
    $scope.update = function(e) {
      if(e.keyCode == 27) {
        $scope.$digest();
      }
    } 
    
    $document.bind('keydown', function ($event) {
        if ($event.keyCode == 27) {
            $rootScope.sidebar = false;
            $rootScope.$digest()
        }
    });