2
        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,但在创建实例后被设置为一个值

4

3 回答 3

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

于 2013-10-16T15:16:59.803 回答
1

当 $watch 触发时, oldValue 和 newValue 总是不同的,只有一个例外:当 watcher 被初始化时。所以,函数第一次运行时,这将是真的:oldValue===newValue. 来自 AngularJS文档

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

于 2016-03-30T13:26:22.757 回答
0

除非值更改,否则$watch 不会触发回调......初始化除外(请参阅https://docs.angularjs.org/api/ng/type/$rootScope.Scope)。因此,显示的输出必须来自初始化。下次触发回调时,新值将不是未定义的。

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

于 2014-10-07T17:29:11.230 回答