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,但在创建实例
后设置为一个值答案 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回调中的新值。