Javascript 是否可以在筛选器中使用angularjs缓存资源方法?
我在作用域中有一个属性,它的id为外部对象,我还有一个过滤器,可以将此id扩展为完整对象,如下所示:Javascript 是否可以在筛选器中使用angularjs缓存资源方法?,javascript,angularjs,caching,Javascript,Angularjs,Caching,我在作用域中有一个属性,它的id为外部对象,我还有一个过滤器,可以将此id扩展为完整对象,如下所示: {{ typeId | expandType }} 过滤器: .filter('expandType', ['TypeService', function (tsvc) { return function (id) { return tsvc.types.get({ id: id }); } }]) 其中tsvc.types.get是添加了缓存选项的普通资源获取方法 .fac
{{ typeId | expandType }}
过滤器:
.filter('expandType', ['TypeService', function (tsvc) {
return function (id) {
return tsvc.types.get({ id: id });
}
}])
其中tsvc.types.get是添加了缓存选项的普通资源获取方法
.factory('TypeService', ['$resource', function ($resource) {
var typeResource = $resource('/api/types/:id', { id: '@id' }, {
get: { method: 'GET', cache: true, params: { id: '@id' } }
});
return {
types: typeResource
}
}])
据我所知,angular在第一次之后运行额外的摘要,只是为了确保没有任何变化。但是很明显,在下一个摘要中,过滤器返回了一个不同的对象,我得到的infdig错误摘要是在无限循环中执行的
我希望,如果资源被缓存,它将始终从缓存返回相同的对象。我可以确认,在执行get时,只有一次服务器访问,所以缓存可以正常工作
如何使其正常工作并使用筛选器将ID扩展到完整对象?尽管可能,但将承诺绑定到视图通常不是一个好主意。在您的情况下,每个摘要都会重新评估过滤器,并引用以下内容: 启用缓存时,$http将来自服务器的响应存储在指定的缓存中。下次发出相同的请求时,将从缓存提供响应,而不向服务器发送请求 请注意,即使响应是从缓存提供的,数据的传递也是异步的,与实际请求的传递方式相同 为了澄清,ngResource在内部使用$http 您仍然可以使用从控制器调用它的筛选器:
app.filter('expandType', function ($http) {
return function (id) {
return $http.get('data.json');
};
});
app.controller('MainCtrl', function ($scope, expandTypeFilter) {
var typeId = 'hello';
expandTypeFilter(typeId).success(function (data) {
$scope.expandedTypeId = data[typeId];
});
});
普朗克:
使用这种方法,如果缓存响应的唯一原因是为了避免对服务器的重复调用,那么现在可以停止缓存,以便稍后它可以获得新的数据,当然这取决于您的需要。我真的想使用过滤器,因为它在整个应用程序中都被使用,我不想让控制器混乱不堪。此时,我给出的解决方案如下所示:
.filter('expandType', ['TypeService', function (tsvc) {
var cache = {};
return function (id) {
if (!id) {
return '';
}
var type = cache[id];
if (!type) {
tsvc.types.get({ id: id }).$promise.then(function (data) {
cache[id] = data;
});
cache[id] = {}
return cache[id];
}
else {
return type;
}
}
}])