Page 447 - AngularJS权威教程
P. 447

32.6  优化过滤器    427


              32.5.2  $watch函数的自动优化                                                                  19

                  最新版的Angular在找到恒定值时(比如,表达式解析为布尔值或者静态的整数)会自动移
              除$watch函数。                                                                             20
                  // 下面这些监控器会被自动移除
                  // 因为Angular的$watches会检测到这些值都是不会改变的值                                               21
                  $scope.$watch('true', function() {});
                  $scope.$watch('2 + 2', function() {});
                                                                                                     22
              32.6  优化过滤器
                                                                                                     23
                  位于视图中的每个过滤器将至少被调用2次,这是过滤器的本质。越是保持这些函数轻量以
              及对它们进行优化,应用程序就会更快。
                                                                                                     24
              32.6.1  不变的数据
                                                                                                     25
                  出于这个原因,分析在哪里以及为什么在视图中使用过滤器通常是个好注意。一个好的经验
              法则:任何可以从视图中移除的过滤器都需要改造一下。
                                                                                                     26
                  也就是说,当检索到数据时,可以转换这个模型,而不是在视图中使用currency过滤器。那
              样,我们就不必在视图中运行两次过滤器。
                                                                                                     27
                  也就是说不要在视图中使用过滤器,就像这样:

                  <!-- 使用过滤器 -->                                                                     28
                  <div>{{ receipt.total_cost | currency }}</div>
                  可以使用$filter服务在你的控制器(或者服务)中转换这个receipt.total_cost。
                                                                                                     29
                  .controller('ReceiptController', function($scope, $filter) {
                      $scope.receipt_total_sum = 12345;
                      $scope.receipt.total_cost = $filter('currency')($scope.receipt.total_sum);     30
                  });

              32.6.2  过滤后的数据                                                                         31

                  我们还有其他的过滤器,比如实时搜索过滤器,它会使用ng-repeat以及通过使用用于分类
              的orderBy过滤器限定集合中的重复数据。在这些情况下,数据并不会改变,只是设置数据如何                                          32
              显示在屏幕上。
                                                                                                     33
                  我们可以缓存分类过的、筛选过的结果,只在必要时执行排序,而不是在每个$digest循环
              中调用这些过滤器。这个变量缓存叫做记忆缓存。
                                                                                                     34
                                 ①
                          记忆缓存 是一种用于加速应用程序的优化技巧,用于这些情况:先前已经调用
                         过函数,对于给定输入,函数结果没有像预期那样发生改变。
                                                                                                     35
              ——————————
                 ① Memoization是一种加速程序的优化技术,为了防止重复计算,它会保留程序的调用结果。更多信息参考维基百科:                          36
                   Memoization(en.wikipedia.org/wiki/Memoization)。——译者注
   442   443   444   445   446   447   448   449   450   451   452