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