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 ,将使用默认的$httpcaching来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.'); }); 

代码中唯一的区别是:

  1. 使用$ cachedResource而不是$ resource
  2. 提供一个“键”(上面例子中的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 }}), } }]);