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。由于用户通过输入一
   345   346   347   348   349   350   351   352   353   354   355