Page 350 - AngularJS权威教程
P. 350
330 第 23 章 digest 循环和$apply
在这段代码中,$scope.$watch()函数在$scope对象上为full_name属性设置了一个监控表
达式。
23.4 $watchCollection
此外,Angular还允许我们为对象的属性或者数组的元素设置浅监控,然后只要属性发生变
化就触发监听器回调。
使用$watchCollection还可以检测对象或数组何时发生了变化,以便确定对象或数组中的
条目是何时添加、移除或者移动的。$watchConllection的行为与$digest循环中标准的$watch
的行为一样,我们甚至可以把它当作标准的$watch。
$watchCollectiion()函数接受2个参数。
obj(字符串/函数)
这个对象就是一个要监控的对象。如果传入一个字符串,它将被当作Angular表达式求值。
如果传入的是一个函数,将在当前作用域中被调用,并且会返回要监控的值。
listener(函数)
这个回调函数会在集合发生变化时触发。类似于$watch函数,这个函数会被来自$watch的
新集合触发调用,而原来的集合(先前集合的副本)以及所在的作用域也随之生效。
$watchConllection()函数也返回一个注销函数。调用这个注销函数时,也会取消集合上的
$watch。
$scope.$watchCollection('names',
function(newNames, oldNames, scope) {
// names集合已经发生了变化
});
23.5 页面中的$digest 循环
让我们一起来看看Web页面中的$digest循环过程。首先,假设有一个(非常不可靠的)登
录页面,这个页面带有一个唯一的用户名字段,允许用户使用唯一的表单验证进行登录。
我们不推荐使用这种不安全的表单验证。
<h2>Sign in</h2>
<input type="text" placeholder="Your name" ng-model="name" ng-minlength="3" />
<input type="submit" ng-click="login()" value="Login" />
这里通过ng-model指令在视图中绑定了一个name,Angular会设置一个隐式的监控器,将这
个输入字段的值绑定为当前的$scope对象。
当用户输入一个字符到表单中时,Angular上下文就会生效并开始遍历$$watchers($watch
列表)。
在这个例子中,$watch列表只包含了一个唯一的元素:$scope.name。由于用户通过输入一