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

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

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

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

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

Благодарю.

3 ответа

Решение

Держите логическое значение и получите $http кэш:

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

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

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

Вместо использования логического аргумента в 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 }
    });
});

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

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

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

'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 get (не кэшируется).

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

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

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

Другие вопросы по тегам