var app = angular.module('app', []);
app.controller('TheCtrl', ['$scope', function (scope) {
scope.user = {
name: "木士羽",
email: 'fdaf@qfdsafq.com',
};
scope.$watch('user.name', function () {
console.log('change');
});
}]);
angular.bootstrap(document.documentElement, ['app']);
加载页面时,在控制台中打印“更改”。
初始化时会触发 $watch
。如何避免呢?
答案 0 :(得分:3)
这种方法怎么样:
第一次oldValue
将等于newValue
,因此请通过if
验证来避免这种情况。
$scope.$watch(
function() {
return $scope.user.name;
},
function(newValue, oldValue) {
if (oldValue !== newValue) {
// .....
}
});
演示 Fiddle
顺便说一句,在观察者中编写if (oldValue !== newValue){ /* ...*/}
以避免在监视下执行额外代码是一个很好的做法
答案 1 :(得分:0)
您第一次可以将标志初始化为true,并且一旦触发了手表,就可以将其设置为false。这样手表就不会被触发。 var firstTime = true 然后当第一个$ watch开火时,做
$scope.$watch('testValue', function() {
if (firstTime) {
$timeout(function() { firstTime = false; });
} else {
//perform operation.
}
angular doc推荐的第二种方法 第一次调用监听监听器时,旧值和新值是相同的。所以检查下面给出的不等条件
$scope.$watch('testValue', function(newValue, oldValue) {
if (newValue !== oldValue) {
// perform your operation
}
});
答案 2 :(得分:0)
根据docs,您应检查新值和旧值是否不同,例如
$scope.$watch('user.name', function(newVal, oldVal) {
if (newVal !== oldVal) {
// Do something with newVal
}
});
答案 3 :(得分:-1)
scope.$watch('user.name', function (val) {
if (val !== undefined) {
console.log('change');
}
});