角度范围手表在我的应用程序中无效

时间:2015-11-13 21:13:09

标签: javascript angularjs angularjs-directive angularjs-scope

我已经得到以下代码,我试图根据是否在全局窗口范围内按下了某个键来显示/隐藏文本框。但是,每按一次键,它似乎不会触发监视服务。为什么是这样?

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!');
 });
});

2 个答案:

答案 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以角度方式进行。