96

次のように、デフォルトの $http キャッシュ実装を使用する単純な User $resource があります。

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

これは非常にうまく機能します。つまり、サーバーはアプリケーションで 1 回だけ呼び出され、値はキャッシュから取得されます。

しかし、特定の操作の後にサーバーから値を更新する必要があります。それを行う簡単な方法はありますか?

ありがとう。

4

3 に答える 3

119

ブール値を保持して$httpキャッシュを取得します。

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

$cacheFactory次に、以下に示す使用例である で作成された別のキャッシュと同じように制御できます。

$httpDefaultCache.remove(key);
// Where key is the relative URL of your resource (eg: /api/user/current/51a9020d91799f1e9b8db12f)
于 2013-06-12T11:59:20.913 に答える
18

cacheそれぞれのプロパティでブール値の引数を使用する代わりに、$cacheFactoryactionで作成されたキャッシュ インスタンスを渡すことができます。これにより、より詳細に制御できます (つまり、キャッシュをクリアします)。

使用例:

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 }
    });
});
于 2013-06-12T07:53:01.620 に答える
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で実行されています。

于 2013-11-09T18:11:43.827 に答える