当新旧值相同时,Angular手表会被触发

时间:2013-10-16 15:11:51

标签: javascript angularjs

        function infoboxController($scope) 
{

    $scope.current_view_ =  myGlobalInstance.current_view_;


    $scope.$watch($scope.current_view_, 
            function(newValue, oldValue)
            {       
                console.log(newValue);
                console.log(oldValue);

                console.log($scope.current_view_);

                if($scope.current_view_!=null)
                    $scope.dataset = $scope.current_view_.dataset;  
            }
        );

}   

控制台输出

undefined infobox.js:10
undefined infobox.js:11
null 

myGlobalInstance是我创建的JS类的一个实例。它的current_view_最初为null,但在创建实例

后设置为一个值

3 个答案:

答案 0 :(得分:2)

我不知道为什么$watch功能无法自动解决此问题,但您是对的。只要对$watch属性的引用的引用发生更改或更新,就会触发$scope回调。这意味着即使引用更改为相同的先前值,也会触发回调。

要解决此问题,请执行以下操作:

$scope.$watch('current_view_', function(newVal, oldVal){
    if(newVal != oldVal){  // if values are the same, don't do anything
        // do the rest of your code here, such as:
        $scope.dataset = $scope.current_view_.dataset;
    };
});

仍然会调用观察者回调,但至少在你不想要时它不会做任何事情。 $watch引用仍然会在$scope.current_view_引用更改的每个时间被称为,但这样它实际上不会设置$scope.dataset值,如果它只是改变之前的相同值。这有意义吗?

答案 1 :(得分:1)

当$ watch触发时,oldValue和newValue总是不同,只有一个例外:当观察者初始化时。因此,第一次运行该函数时,这将是真的:oldValue===newValue。来自AngularJS documentation

  

在观察者注册观察者之后,异步调用侦听器fn(通过$ evalAsync)来初始化观察者。在极少数情况下,这是不可取的,因为当watchExpression的结果没有改变时会调用监听器。要在侦听器fn中检测此场景,您可以比较newVal和oldVal。如果这两个值相同(===)则由于初始化而调用了监听器。

答案 2 :(得分:0)

$ watch 触发回调,除非值发生变化...除了初始化(参见https://docs.angularjs.org/api/ng/type/$rootScope.Scope)。因此,显示的输出必须来自初始化。下一次回调触发时,新值将是未定义的值。

您并没有真正提出问题或描述您遇到的问题。也许你很惊讶旧值可以等于$ watch回调中的新值。