angularjs:如何添加caching资源对象?
在http里添加caching非常简单。 (通过传递caching=真)
http://docs.angularjs.org/api/ng.$http有caching选项。
如何在angularjs的$ resource中添加类似的function?
从1.1.2( 提交 )开始,所有$ httpConfig选项直接显示在$ resource操作对象中:
return { Things: $resource('url/to/:thing', {}, { list : { method : 'GET', cache : true } }) };
在AngularJs中实现自己的caching很容易。 只要使用$ cacheFactory :
app.factory('myService', function($resource, $cacheFactory) { var cache = $cacheFactory('myService'); var User = $resource('/user/:userId', {userId:'@id'}); return { getResource: function(userId) { var user = cache.get(userId); if (!user) { user = User.get({userId:userId}); cache.put(userId, user); } return user; } }; });
作为文档状态, $ resource已经内置了对$ cacheFactory的支持。 您可以通过每个操作的cache
属性传递它:
cache
–{boolean|Cache}
– 如果为true
,将使用默认的$http
caching来cachingGET
请求,否则如果使用$cacheFactory
构buildcaching实例,则将使用此caching进行caching。
用法示例:
app.factory('Todos', function($resource, $cacheFactory) { var todosCache = $cacheFactory('Todos'); return $resource(apiBaseUrl + '/todos/:id', {id: '@id'}, { 'get': { method:'GET', cache: todosCache}, 'query': { method:'GET', cache: todosCache, isArray:true } }); });
这似乎没有提到这里,但你也可以覆盖默认的方法。
app.factory("List", ["$resource", function($resource) { return $resource("./lists/:path/:action.json", {}, { get: { method: "GET", cache: true } }); }]);
您还可以为$ http设置默认caching,从而为$ resource设置基于它的值。
我的设置与良好的angular度caching允许LocalStorage和兼容$ cacheFactory:
app.run(function($http, DSCacheFactory) { DSCacheFactory('defaultCache', { deleteOnExpire: 'aggressive', storageMode: 'localStorage' }); $http.defaults.cache = DSCacheFactory.get('defaultCache'); });
查看angular度资源来源指示触发caching不可能以当前写入的方式进行。
以下是源代码中的请求对象:
$http({ method: action.method, url: route.url(extend({}, extractParams(data), action.params || {}, params)), data: data }).then(...)
有几个潜在的方法来处理这个问题。
首先,您可以使用客户端持久性进行本地caching。 我用包装器(b / c我不喜欢API语法) amplify.store 。 有很多其他的存储解决scheme,取决于你在找什么和浏览器的目标。 不less人也使用了草椅 。
然后,您可以在本地对模型进行串联和存储,并根据您所需的任何规则或时间限制进行更新。
另一个解决scheme是简单地修改angular度资源接受你正在寻找的参数。 这可能是简单的(只需向$ resource添加一个额外的参数)或复杂的,因为你需要它。
例如
function ResourceFactory(url, paramDefaults, actions, cache) { ... var cache = cache != null ? cache : false; // Set default to false $http({ method: action.method, url: route.url(extend({}, extractParams(data), action.params || {}, params)), data: data, cache: cache }).then(...) }
最后,根据您的要求,使用angular.factory创build服务可能会更简单地创build自己的资源。 ngResource的优点之一就是在翻译参数时,所有的string插值都可以为你工作。 但是,如果您需要,您肯定可以将这个逻辑parsing出来,或者根据您使用的模型编写自己的逻辑。
我刚刚遇到这个真正深思熟虑的模块,称为angular度caching资源,将为你做的工作。 https://github.com/goodeggs/angular-cached-resource
这是对$资源的replace,增加了使用localStorage进行cachingpipe理的function。 如果您的浏览器不支持本地存储,您将无法获得任何caching权益。 下面是一个如何使用它的例子:
旧的方式使用$资源:
var Entry = $resource('/entries/:slug', {slug: '@slug'}); var announcement = new Entry(); announcement.slug = 'announcing-angular-cached-resource'; announcement.title = 'Announcing Angular Cached Resource'; announcement.body = 'Here is why Angular Cached Resource is awesome!'; announcement.$save(function() { alert('Saved announcement.'); });
使用$ cachedResource的新方法:
var Entry = $cachedResource('entries', '/entries/:slug', {slug: '@slug'}); var announcement = new Entry(); announcement.slug = 'announcing-angular-cached-resource'; announcement.title = 'Announcing Angular Cached Resource'; announcement.body = 'Here is why Angular Cached Resource is awesome!'; announcement.$save(function() { alert('Saved announcement.'); });
代码中唯一的区别是:
- 使用$ cachedResource而不是$ resource
- 提供一个“键”(上面例子中的
entries
),以便在页面刷新或重新加载之间引用它。 这些条目从使用localStorage开箱即可保留。
详细教程可以在这里find: https : //github.com/goodeggs/bites/blob/master/src/documents/open_source/2014-04-24-angular-cached-resource.md
另外请注意,Angular 2.0可能支持这样的开箱即用: https : //docs.google.com/document/d/1DMacL7iwjSMPP0ytZfugpU4v0PWUK0BT6lhyaVEmlBQ/edit
我正在使用angular度资源1.5.5,并按以下方式设置我的代码:
概要
将操作设置为查询 ,并且由于“查询”操作期望反序列化为数组,因此isArray将需要显式设置为true。 我的理解是默认情况下ngResource操作期望除了查询的对象。 看这里
调节器
angular.module("app") .controller('myCtrl',['$scope','myService',function($scope, myService) { $scope.myData= myService.myResource.query(); }]);
服务
angular.module('app') .factory('myService',['$resource',function($resource){ var baseUrl = 'http://www.MyExample.com/'; return{ myResource:$resource(baseURL + '/myEndpoint/:id', {id:'@id'},{ 'query':{ method:'GET', cache:'true', isArray:true }}), } }]);