我一直在搜索像这样的帖子[1]:How to refresh / invalidate $resource cache in AngularJS,但是对于这个特定(但相当普遍)的情景,我会很高兴听到角度专家的正确方法。
我在这里寻找一般模式。无论是理解还是实施角度 - 我都是新手。
我有一个非常标准的ngResource
服务,它有一个非常标准的query
方法和一个自定义的放置方法update
。
myServices.factory('ThingsService', [
'$resource',
function ($resource) {
return $resource('/api/things/:id', { id: '@id' }, {
query: { method: 'GET', isArray: true, cache: true },
update: {method: 'PUT', cache: true },
});
}]);
我在这样的控制器中使用它:
$scope.things = ThingsService.query(function (x) {
// must assign these only once data is loaded
$scope.allCount = x.Things.length;
$scope.incomingCount = $filter('filter')(x.Things, { State: 'incoming' }).length;
});
到目前为止一切顺利。数据返回正常,并在仪表板视图中很好地呈现。
我们支持就地编辑,用户可以在仪表板列表中编辑数据。
首先使用thing
获取angular.copy(...)
的卷影副本,以便我们可以支持缓冲用户的更改。 (就像对话框为用户做的那样)。然后当他们确认他们的更改时,我们使用卷影副本调用:
ThingsService.update({ id: currentThing.Id }, { Data: currentThing.Data }, function () {
//TODO: now, if this PUT succeeds,
//I want to update the value of $scope.things array to reflect the changes,
//without going to back to the server for the whole array.
});
这正确地将更改发送到服务器,该服务器返回更新的thing
,但是绑定到query
方法的仪表板视图不会自动更新。有点希望有角度,ThingsService
及其缓存会以某种方式为我处理,你知道通过更新缓存数据。由于服务应该知道我刚刚更新了服务提供的其中一个项目。
为了避免一直回到服务器,我们告诉ThingsService
缓存其结果,这是一个好的开始。但是你应该如何更新缓存数据中已更改的thing
?
使用ngResource
服务进行此类更新是否有标准模式?
最好不要直接搞乱缓存。我甚至不在乎它是缓存还是如何缓存。我只想让$scope.things
反映发布的更改更改。