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
   344   345   346   347   348   349   350   351   352   353   354