角度范围监视的行为与记录不符

时间:2014-05-06 18:04:44

标签: javascript angularjs angularjs-scope

Angular文档显示了此测试用例。

       // let's assume that scope was dependency injected as the $rootScope
       var scope = $rootScope;
       scope.name = 'misko';
       scope.counter = 0;

       expect(scope.counter).toEqual(0);
       scope.$watch('name', function(newValue, oldValue) {
         scope.counter = scope.counter + 1;
       });
       expect(scope.counter).toEqual(0);

       scope.$digest();
       // no variable change
       expect(scope.counter).toEqual(0);

您可以在此处看到scope.name在添加$watch之前设置,并且该计数器保持为零。

我无法在jsFiddle中重现这一点。

http://jsfiddle.net/thinkingmedia/3ttKV/

我希望这段代码第一次不会显示警告。只有在名称更改时才会触发。

        $scope.name = 'Nick';
        $scope.$watch('name',function(){
            alert('name changed');
        });

我如何按照文档记录这项工作。我需要使用一些默认值设置我的范围,并且除非更改它们,否则不会触发观察者。

1 个答案:

答案 0 :(得分:4)

在初始化观察者时将调用侦听器,在这种情况下,newValue === oldValue,因此您需要检查如下:

$scope.name = 'Nick';
$scope.$watch('name',function(newValue, oldValue){
    if (newValue !== oldValue) {
        alert('name changed');
    }
});