AngularJS'de $ kaynak önbelleği nasıl yenilenir / geçersiz kılınır


95

Varsayılan $ http önbellek uygulamasını şu şekilde kullanan basit bir Kullanıcı $ kaynağım var:

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

Bu çok iyi çalışıyor, yani sunucum uygulamamda yalnızca bir kez çağrılıyor, ardından değer önbellekten getiriliyor.

Ancak belirli bir işlemden sonra sunucudaki değeri yenilemem gerekiyor. Bunu yapmanın kolay bir yolu var mı?

Teşekkürler.


1
Kararsız kullanıyorum (1.1.5 ancak 1.1.2'den beri var olduğunu düşünüyorum) cache- {boolean|Cache}-
Doğruysa

1
benzer bir sorun yaşıyorum ama sadece test ederken. bu şeyi tarayıcı düzeyinde nasıl bozarım?
chovy

Yanıtlar:


117

Boole değerini koruyun ve $httpönbelleği alın:

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

Daha sonra $cacheFactory, aşağıda verilen kullanım örneği ile yapılmış başka bir önbellek gibi kontrol edebilirsiniz :

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

52
Mükemmel, teşekkürler! Tam olarak aradığım şey. Merak edenler için, kaynağınızın göreli URL'si olan $ cacheFactory.get ('$ http']. Remove (key) 'i çağırabilirsiniz (örn: / api / user / current / 51a9020d91799f1e9b8db12f).
Alexandre Bulté

2
Aslında, remove () 'yi çağırırken herhangi bir sorgu parametresiyle birlikte tam url'yi belirtmem gerektiğini fark ettim. Burada bir şey mi kaçırıyorum?
shangxiao

3
Dinamik sorgu parametrelerim var. URL'ye $resourcefabrikadan erişmenin bir yolu var mı ?
suzanshakya

1
Bu işe yararken. Gerekenden daha karmaşık olabilir. Bunun uygulanması daha iyi bir çözüm olabilir: github.com/angular/angular.js/issues/9064
KFunk

5
Benim için $ cacheFactory.get ('$ http']. RemoveAll () önbelleğe alınmış tüm verileri temizlemem gerektiği için hile yaptı.
S. Baggy

18

cacheHer birinin özelliğinde bir mantıksal bağımsız değişken kullanmak yerine, üzerinde daha fazla kontrole sahip olabileceğiniz $ cacheFactoryaction ile oluşturulmuş bir önbellek örneğini iletebilirsiniz (yani önbelleği temizleyebilirsiniz).

Örnek kullanım:

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

Teşekkürler. Bunu ben de gördüm, ama o yoldan gitmeden önce bunu yapmanın "standart" bir yolunu arıyordum ...
Alexandre Bulté

1
"açısal yol" ile uyumlu çok "standart" bir yaklaşım gibi görünüyor :)
Varyant

1
Haklısın. Standart $ kaynak önbelleği ile bir yaklaşımı kastettim.
Alexandre Bulté

6

Benzer bir şey arayan bu iş parçacığına rastladım, ancak $ resource'un önbelleği sizin için otomatik olarak yöneteceğini fark ettim, bu nedenle önbelleği temizlenmeye zorlamaya gerek yok.

Buradaki fikir, sorgulayabileceğiniz bir kaynağa sahipseniz, bu sorgu yanıtının önbelleğe alınacağı, ancak aynı kaynak için bir şey kaydederseniz, önceden önbelleğe alınan verilerin geçersiz olması gerektiğidir, bu nedenle sizin için temizlenir. Bu şekilde çalışacağı mantıklı.

İşte bunu yapmak için kullandığım bazı kodlar (muhtemelen tuhaf görünen fabrika yaratma kısmını görmezden gelebilir ve "sınıf" gövdesine dikkat edebilirsiniz).

'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 işlevini birkaç kez çağırırsanız, ilk çağrı bir http alma isteğinde bulunur ve sonraki tüm çağrılar önbelleğe alınır. Yine de addPlayer'ı çağırırsanız, beklendiği gibi bir http gönderimi gerçekleştirilir ve ardından listPlayers'a yapılan sonraki çağrı bir http alma (önbelleğe alınmaz) gerçekleştirir.

Bu sizi, başka birinin ($ http) önbelleğini yönetme ve istekler için hangi url'lerin kullanıldığını ve hangilerinin önbellekleri doğru zamanda temizlediğini takip etme işinin dışında kalmanızı sağlar.

Sanırım buradaki hikayenin ahlaki, kütüphaneyle çalışmak ve her şey iyi olacak ... herhangi bir hata veya eksik özellik dışında, ancak Angular'da bunlardan hiçbiri yok;)

ps Bunların hepsi AngularJS 1.2.0 üzerinde çalışıyor.


2
Evet, "normal" koşullarda Angular kaynağının önbelleği nasıl ve ne zaman geçersiz kılacağını bildiğini ve mükemmel çalıştığını anlıyorum ve kabul ediyorum. Ancak kullanım durumum biraz farklıydı: Yenilemeye zorlamak istedim çünkü Angular'ın bir yenilemeye ihtiyaç olduğunu bilmesinin bir yolu yoktu - kullanıcı nesnesi Angular uygulamasının dışında değiştiriliyordu.
Alexandre Bulté

3
Bunun belgelendiği yeri gösteren biri olabilir mi? Bunu daha önce Stack Overflow'da okudum, ancak belgelerde bundan bahsedemiyorum. Bunu uygulamamda da denedim, ancak belki de yol boyunca yanlış bir şey yapmış olabilirim ...
Sunil D.

1
Ancak $ delete ile çalışmıyor gibi görünüyor. Bir sonraki çağrı önbellekten tekrar çekilecek ve silinen öğe yeniden görünecektir. Onaylayan var mı?
Lukus

Bu işe yaramayacak ngResource Önbellek geçersiz kılma işlemlerini YAPMAYIN, buraya gidin örneğin: stackoverflow.com/questions/25117388/…
HugoPoi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.