Page 448 - AngularJS权威教程
P. 448

428  第 32 章  优化 Angular 应用


                 为了使用记忆缓存替代过滤器,需要实现自定义的memoize()函数或者使用第三方库提供的
             函数,比如Underscore.js 或者Lo-Dash 库,这些库都包含了自定义的实现。由于这个函数本身很
                                  ①
                                              ②
             小,在这里我们引入了Lo-Dash库中的这个基本函数定义:
                 function memoize(fn, resolver) {
                     var memoized = {
                         var cache = memoized.cache,
                             key = resolver ? resolver.apply(this, arguments) : +new Date() + '' + arguments[0];
                         return hasOwnProperty.call(cache, key) ? cache[key] : (cache[key] = fn.apply(this,
                 arguments));
                     }
                     memoized.cache = {};
                     return memoized;
                 }
                 本质上,这个函数接受两个参数:一个要缓存的函数和一个可选的resolver函数,它用来为
             存储结果确定缓存键。这个函数返回一个备忘函数。
                 使用它时,可以将这个备忘函数设置为作用域对象的函数调用,这样就可以在视图中调用
             它了。

                 angular.module('myApp', [])
                 .controller('MainController', function($scope $filter) {
                     $scope.getNames = memoize(function() {
                         return $filter('orderBy')(
                             $scope.names,
                             $scope.orderBy,
                             $scope.reverseList
                         );
                     },
                     function() {
                         // resolver函数返回一个表示缓存键的字符串
                         return $scope.orderBy + '-' + $scope.reverseList;
                     });
                 });
                 当在视图中调用getNames()时,第一次它会调用orderBy过滤器。第二次调用过滤器时,它
             并不会运行,因为此时缓存中已经包含了排序后的键。

                 有时,你可能希望手动清除缓存(比如,添加或者移除条目更新数据)。由于缓存就在函数
             对象上(作为函数的属性存在),因此可以通过设置它的值为一个新的{ }对象简单地清除它。

                 $scope.getNames.cache = {};

             32.7  页面加载优化技巧


                 我们还可以优化在客户端浏览器中渲染页面时需要花的时间。当然,这里并没有银弹 可以
                                                                                           ③
             确定客户端加载页面的最佳机制,正如大部分问题都取决于服务端的组成部分、位置和主机。

             ——————————
                ① http://underscorejs.org/
                ② http://lodash.com/
                ③ 没有银弹,软件工程中对软件工程问题的一种描述。更多信息参考维基百科:没有银弹(http:t.cn/zWIKVjT)。
                                                                                        ——译者注
   443   444   445   446   447   448   449   450   451   452   453