AngularJS에서 $ resource 캐시를 새로 고침 / 무효화하는 방법


94

다음과 같이 기본 $ http 캐시 구현을 사용하는 간단한 사용자 $ resource가 있습니다.

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

이것은 매우 잘 작동합니다. 즉, 내 서버가 내 응용 프로그램에서 한 번만 호출 된 다음 캐시에서 값을 가져옵니다.

하지만 특정 작업 후에 서버에서 값을 새로 고쳐야합니다. 그렇게하는 쉬운 방법이 있습니까?

감사.


1
unstable (1.1.5를 사용하고 있지만 1.1.2부터있는 것 같습니다.) cache{boolean|Cache}– true 인 경우 기본 $ http 캐시가 GET 요청을 캐시하는 데 사용됩니다. 그렇지 않으면 캐시 인스턴스가 다음으로 빌드 된 경우
Alexandre Bulté

1
비슷한 문제가 있지만 테스트 할 때만 발생합니다. 브라우저 수준에서이 일을 어떻게 파열합니까?
chovy

답변:


116

부울을 유지하고 $http캐시를 가져옵니다 .

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

그런 다음 $cacheFactory아래에 제공된 사용 인스턴스 인 로 만든 다른 캐시처럼 제어 할 수 있습니다.

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

52
완벽합니다, 감사합니다! 내가 찾던 바로 그것. 궁금한 사람들을 위해 $ cacheFactory.get ( '$ http'). remove (key)를 호출 할 수 있으며 키는 리소스의 상대 URL (예 : / api / user / current / 51a9020d91799f1e9b8db12f)입니다.
Alexandre Bulté 2013-06-12

2
실제로 remove ()를 호출 할 때 쿼리 매개 변수와 함께 전체 URL을 지정해야한다는 것을 알았습니다. 여기에 뭔가 빠졌나요?
shangxiao

3
동적 쿼리 매개 변수가 있습니다. $resource공장 에서 URL에 액세스하는 방법이 있습니까?
suzanshakya

1
이것이 작동하는 동안. 필요 이상으로 복잡 할 수 있습니다. 이것이 구현된다면 더 나은 해결책이 될 것입니다 : github.com/angular/angular.js/issues/9064
KFunk

5
저에게는 캐시 된 모든 데이터를 삭제해야했기 때문에 $ cacheFactory.get ( '$ http'). removeAll ()이 트릭을 수행했습니다.
S. Baggy

18

cache각각 의 속성에 부울 인수를 사용하는 대신 $ cacheFactory로action 생성 된 캐시 인스턴스를 전달하여 더 많은 제어를 할 수 있습니다 (즉, 캐시 지우기).

사용 예 :

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 }
    });
});

감사. ... 나도 봤어,하지만 난 그 길을 가기 전에 그것을 할 수있는 "표준"방법을 찾고 있었다
알렉상드르 Bulté에게

1
"각도"를 준수하는 매우 "표준"접근 방식처럼 보입니다. :)
Variant

1
네가 옳아. 나는 표준 $ resource 캐시를 사용한 접근 방식을 의미했습니다.
알렉상드르 Bulté

6

비슷한 것을 찾고있는이 스레드를 발견했지만 $ 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과 적절한시기에 캐시를 지우는 URL을 따라 잡으려는 업무에서 벗어날 수 있습니다.

여기서 이야기의 교훈은 라이브러리와 함께 작업하는 것이며 버그 나 불완전한 기능을 제외하고는 모두 잘 될 것이라고 생각하지만 Angular에는 이러한 기능이 없습니다.)

ps 이것은 모두 AngularJS 1.2.0에서 실행됩니다.


2
예, "정상적인"조건에서 Angular 리소스는 캐시를 무효화하는 방법과시기를 알고 있으며 완벽하게 작동한다는 것을 이해하고 인정합니다. 그러나 내 사용 사례는 약간 달랐습니다. Angular는 새로 고침이 필요하다는 것을 알 수 없었기 때문에 강제로 새로 고침을 원했습니다. 사용자 개체는 Angular 앱 외부에서 수정되었습니다.
Alexandre Bulté 2013

3
누구든지 이것이 문서화 된 곳을 가리킬 수 있습니까? 이전에 Stack Overflow에서 이에 대해 읽었지만 설명서에서 이에 대한 언급을 찾을 수 없습니다. 내 앱에서도 시도해 보았지만 도중에 뭔가 잘못했을 수도 있습니다 ...
Sunil D.

1
그러나 $ delete와 함께 작동하지 않는 것 같습니다. 다음 호출은 캐시에서 다시 가져오고 삭제 된 항목이 다시 나타납니다. 누구든지 확인할 수 있습니까?
Lukus 2014

이 작동하지 않습니다 ngResource DO NOT 핸들 캐시 무효화 예를 들어 여기 : stackoverflow.com/questions/25117388/...
HugoPoi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.