Javascript 角度范围表的行为不符合文件规定

Javascript 角度范围表的行为不符合文件规定,javascript,angularjs,angularjs-scope,Javascript,Angularjs,Angularjs Scope,角度文档显示了这个测试用例 // 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', func

角度文档显示了这个测试用例

       // 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);
在这里,您可以看到在添加
$watch
之前设置了
scope.name
,并且该计数器保持为零

我无法在JSFIDLE中复制这一点

我希望此代码不会在第一次显示警报。仅当名称发生更改时才应触发

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

我如何才能使其按文档记录的方式工作。我需要将我的作用域设置为一些默认值,并且除非更改观察程序,否则不会触发它们。

当观察程序初始化时,将调用侦听器,在这种情况下,newValue==oldValue,因此您需要按如下所示进行检查:

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

当监视程序初始化时,将调用侦听器,在这种情况下,newValue===oldValue,因此您需要检查如下:

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

好的,这就解决了问题。这是否意味着文档是错误的?@MathewFoscarini$watch docs实际上有一个关于这个问题的段落。好的,这就解决了这个问题。这是否意味着文档是错误的?@MathewFoscarini$watch docs实际上有一个关于这个问题的段落。