我有一个代码段:
var app = angular.module('Demo', []);
app.controller('DemoCtrl', function ($scope) {
function notify(newValue, oldValue) {
console.log('%s => %s', oldValue, newValue);
}
$scope.$watch('collection.length', notify);
$scope.$watch('my', notify);
$scope.collection = [];
$scope.my = 'hello';
});
$watch
最初开火。此代码段将输出:
0 => 0
hello => hello
这是正确的行为吗?当然,我可以检查值是否相等,但是行为的原因是什么?
P.S。您可以在线试用此示例:http://jsbin.com/otakaw/7/edit
答案 0 :(得分:8)
仅当来自当前的值时才调用侦听器
watchExpression
以及先前对watchExpression
的调用不是
相等(除了初始运行,见下文)。
在观察者注册范围后,监听器fn是
异步调用(通过$evalAsync
)初始化观察者。
在极少数情况下,这是不受欢迎的,因为当watchExpression
的结果未发生变化时调用了侦听器。要检测到这一点
监听器fn
中的场景,您可以比较newVal
和
oldVal
。如果这两个值相同(===)那么听众就是
由于初始化而被调用。