Как обновить/недействить кеш ресурсов $в AngularJS

У меня есть простой ресурс User $, который использует реализацию кэша по умолчанию $http так:

factory('User', function($resource){
    return $resource(endpoint + '/user/current/:projectId', {},
        {get: 
            {
                cache: true,
                method: 'GET'
            }
        }
    );
})

Это работает очень хорошо, т.е. мой сервер вызывается только один раз в моем приложении, тогда значение извлекается из кеша.

Но мне нужно обновить значение с сервера после определенной операции. Есть ли простой способ сделать это?

Спасибо.

Ответ 1

Сохраните логическое значение и получите кеш $http:

var $httpDefaultCache = $cacheFactory.get('$http');

Затем вы можете управлять им, как и любой другой кеш, созданный с помощью $cacheFactory, примера использования, приведенного ниже:

$httpDefaultCache.remove(key);
// Where key is the relative URL of your resource (eg: /api/user/current/51a9020d91799f1e9b8db12f)

Ответ 2

Вместо использования логического аргумента в свойстве cache для каждого action вы можете передать экземпляр кеша, созданный с помощью $cacheFactory, который вы можете получить больше контроля (т.е. очистить кеш).

Пример использования:

app.factory('Todos', function($resource, $cacheFactory) {
    var cache = $cacheFactory('todo');
    return $resource(apiBaseUrl + '/todos/:id', { id: '@id' }, {
        'get': { method: 'GET', cache: cache  },
        'query': { method: 'GET', cache: cache, isArray: true }
    });
});

Ответ 3

Я наткнулся на эту тему, ища что-то подобное, но обнаружил, что $resource автоматически будет управлять кешем, поэтому нет необходимости принудительно очищать кеш.

Идея состоит в том, что если у вас есть ресурс, который вы можете запросить, этот запрос будет кэшироваться, но если вы сохраните что-то для этого же ресурса, ранее кэшированные данные должны быть недействительными, поэтому он будет очищен для вас. Имеет смысл, что он будет работать таким образом.

Вот некоторый код, который я использую для этого (вы можете игнорировать возможную нечетную структуру создания factory и обращать внимание на тело "class" ).

'use strict';

sampleApp.players.$ng.factory('sampleApp.players.PlayerService', [
    '$log',
    '$resource',
    sampleApp.players.PlayerService = function ($log, $resource) {
        var service = {};

        $log.info('Creating player resource.');
        var Player = $resource('/api/players', {}, {query: {
            isArray: true,
            cache: true,
            method: 'GET'
        }});

        service.addPlayer = function(playerName) {
            $log.info('Saving a new player.');
            return new Player({name: playerName}).$save();
        };

        service.listPlayers = function () {
            $log.info('Fetching players.');
            return Player.query();
        };

        return service;
    }]);

Если вы вызываете функцию listPlayers несколько раз, первый вызов делает запрос HTTP get и все последующие вызовы кэшируются. Если вы вызываете addPlayer, то http-сообщение выполняется так, как ожидалось, а затем следующий вызов listPlayers будет выполнять HTTP-получение (не кэшируется).

Это избавляет вас от необходимости управления кешем другого ($ http) и пытается не отставать от того, какой URL-адрес используется для запросов и который очищает кеши в нужное время.

Я полагаю, что мораль этой истории - работать с библиотекой, и все будет хорошо... за исключением любых ошибок или неполных функций, но Angular не имеет ни одного из них;)

p.s. Это все работает на AngularJS 1.2.0.