Page 349 - AngularJS权威教程
P. 349
23.3 $watch 329
objectEquality(可选) 19
objectEquality是一个进行比较的布尔值,用来告诉Angular是否检查严格相等。
$watch函数会给监听器返回一个注销函数,我们可以调用这个注销函数来取消Angular对当 20
前值的监控。
21
//...
var unregisterWatch =
$scope.$watch('newUser.email',
function(newVal, oldVal) { 22
if (newVal === oldVal) return; // 初始化
});
// ... 23
// 稍后,可以通过调用这个注销函数来注销这个监控器
unregisterWatch();
在这个例子中,假如完成了对newUser.email的监控,那么可以通过调用它所返回的注销函 24
数来清除这个监控器。
例如,你想要解析一个输入字段的值,然后使用空格分割全名的方式找到名字和姓氏。假定 25
给定的视图看起来像这样:
<input type="text" ng-model="full_name" placeholder="Enter your full name"/> 26
永远不要在控制器中使用$watch,因为它会使控制器难以测试。这里为了解释 27
说明姑且允许这样做,稍后我们会将这些监控移到相应的服务中。
我们在full_name属性上设置一个$watch监听器来检测值的任意变化。也就是在full_name 28
属性上设置$watch函数。
29
angular.module("myApp")
.controller("MyController", ['$scope', function($scope) {
$scope.$watch('full_name', function(newVal, oldVal, scope) {
// newVal表示在这里可以用的full_name新值 30
// 而oldVal表示full_name的旧值
});
}]);
31
在这个例子中,我们设置了一个AngularJS表达式,这会让Angular应用“监控full_name属性
任何可能的变化,然后在检测到变化时运行指定的函数”。
32
监听函数会在初始化时被调用一次,而此时newVal和oldVal的值都为undefined(并且是相
等的)。在这种情况下,如果正处在初始化阶段或者先前的值发生了变化,通常最好是检查内部 33
的表达式。在监控函数内很容易实现这一检查,就像这样:
$scope.$watch('full_name', 34
function(newVal, oldVal, scope) {
if(newVal === oldVal) {
// 只会在监控器初始化阶段运行
} else { 35
// 初始化之后发生的变化
}
}); 36