我已经得到以下代码,我试图根据是否在全局窗口范围内按下了某个键来显示/隐藏文本框。但是,每按一次键,它似乎不会触发监视服务。为什么是这样?
Plnkr http://plnkr.co/edit/qL9ShNKegqJfnyMvichk
app.controller('MainCtrl', function($scope, $window) {
$scope.name = '';
angular.element($window).on('keypress', function(e) {
//this changes the name variable
$scope.name = String.fromCharCode(e.which);
console.log($scope.name)
})
$scope.$watch('name', function() {
console.log('hey, name has changed!');
});
});
答案 0 :(得分:0)
这是因为您正在处理摘要周期之外的keypress
事件。我强烈建议你让角度通过数据绑定或使用ngKeypress
否则,在您的处理程序中,请致电$scope.$digest()
。
angular.element($window).on('keypress', function(e) {
//this changes the name variable
$scope.name = String.fromCharCode(e.which);
console.log($scope.name);
$scope.$digest();
})
答案 1 :(得分:0)
在高级视图中,观察范围上的值需要两个部分:
首先:观察者 - 就像你创造了一个。每个观察者都有两个部分,监视功能(或者像这里的值)和监听器功能。 watch函数返回被监视对象,当对象发生更改时调用侦听器函数。
第二:$摘要周期。 $ digest遍历作用域上的所有观察者,调用watch函数,将返回的newValue与oldValue进行比较,并调用相应的侦听器函数(如果这两者不匹配)。这称为脏检查。
但是有人不得不提供$ digest。 Angular在你的指令中做了它,所以你不在乎。此外,所有内置服务都会启动摘要。但是如果你在角度控制之外更改对象,你必须自己调用$ digest,或者首选方式,使用$ apply。
$scope.$apply(function(newName) {
$scope.name = newName;
});
$ apply首先评估函数,然后启动$ digest。
在您的特殊情况下,我建议使用ngKeypress以角度方式进行。