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)。——译者注