AngularJS में $ संसाधन कैश को ताज़ा / अमान्य कैसे करें


94

मेरे पास एक सरल उपयोगकर्ता $ संसाधन है जो डिफ़ॉल्ट $ http कैश कार्यान्वयन का उपयोग करता है जैसे:

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

यह बहुत अच्छी तरह से काम करता है, अर्थात मेरे सर्वर को केवल एक बार मेरे आवेदन में कहा जाता है, फिर मूल्य को कैश से प्राप्त किया जाता है।

लेकिन मुझे एक निश्चित ऑपरेशन के बाद सर्वर से मान को ताज़ा करना होगा। क्या ऐसा करने का एक आसान तरीका है?

धन्यवाद।


1
मैं अस्थिर (1.1.5 का उपयोग कर रहा हूं, लेकिन मुझे लगता है कि यह 1.1.2 के बाद से है) cache- {boolean|Cache}- यदि सही है, तो जीईटी अनुरोध को कैश करने के लिए डिफ़ॉल्ट $ http कैश का उपयोग किया जाएगा, अन्यथा यदि कैश उदाहरण के साथ बनाया गया है
अलेक्जेंडर बुल्ट

1
मैं ऐसी ही समस्या है, लेकिन केवल जब परीक्षण कर रहा हूँ। मैं ब्राउज़र स्तर पर इस बात का पर्दाफाश कैसे करूं?
चोवी

जवाबों:


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') को हटा सकते हैं (कुंजी) हटा सकते हैं, कुंजी आपके संसाधन का रिश्तेदार URL है (उदा: / api / user / current / 51a9020d91799f1b9b8db12f)।
अलेक्जेंड्रे बूल्ट

2
वास्तव में मैंने पाया कि मुझे हटाने () को कॉल करते समय किसी भी क्वेरी पैरामीटर के साथ पूर्ण यूआरएल को निर्दिष्ट करने की आवश्यकता थी। क्या मुझसे कोई चूक हो रही है?
शांक्सीसियो

3
मेरे पास गतिशील क्वेरी पैरामीटर हैं। क्या $resourceकारखाने से url एक्सेस करने का कोई तरीका है ?
सुजानशाक्य

1
जबकि यह काम करता है। यह आवश्यकता से अधिक जटिलता हो सकती है। एक बेहतर समाधान होगा यदि इसे लागू किया गया था: github.com/angular/angular.js/issues/9064
KFunk

5
मेरे लिए, $ cacheFactory.get ('$ http')। removeAll () ने चाल चली, क्योंकि मुझे सभी कैश्ड डेटा को साफ़ करने की आवश्यकता थी।
एस। बग्गी

18

cacheप्रत्येक की संपत्ति में एक बूलियन तर्क का उपयोग करने के बजाय 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 }
    });
});

धन्यवाद। मैंने वह भी देखा, लेकिन मैं उस रास्ते से नीचे जाने से पहले इसे करने के लिए "मानक" तरीके की तलाश कर रहा था ...
एलेक्जेंडर बुल्टे

1
एक बहुत ही "मानक" दृष्टिकोण "कोणीय रास्ता" के अनुरूप लगता है :)
वेरिएंट

1
आप सही हे। मेरा मतलब था मानक $ संसाधन कैश के साथ एक दृष्टिकोण।
अलेक्जेंड्रे बूल्ट

6

मैं कुछ इसी तरह की तलाश में इस धागे में आया था, लेकिन पाया कि $ संसाधन आपके लिए कैश को स्वचालित रूप से प्रबंधित करेगा, इसलिए कैश को साफ करने के लिए मजबूर करने की कोई आवश्यकता नहीं है।

विचार यह है कि यदि आपके पास एक संसाधन है जिसे आप क्वेरी कर सकते हैं, तो उस क्वेरी प्रतिक्रिया को कैश किया जाएगा, लेकिन यदि आप उसी संसाधन के लिए कुछ बचाते हैं, तो पहले से कैश किया गया डेटा अमान्य होना चाहिए, इसलिए यह आपके लिए क्लियर हो गया है। यह समझ में आता है कि यह इस तरह से काम करेगा।

यहाँ कुछ कोड का उपयोग मैं कर रहा हूँ (आप संभवतः विषम दिखने वाले कारखाने निर्माण भाग को अनदेखा कर सकते हैं और "क्लास" बॉडी पर ध्यान दे सकते हैं)।

'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 प्राप्त करने का अनुरोध करता है और बाद की सभी कॉल कैश की जाती हैं। यदि आप addPlayer को कॉल करते हैं, तो एक http पोस्ट अपेक्षित रूप से किया जाता है, और फिर listPlayers के लिए अगली कॉल एक HTTP प्राप्त (कैश नहीं किया गया) प्रदर्शन करेगा।

यह आपको किसी और के ($ http) कैश को प्रबंधित करने के व्यवसाय से बाहर रखता है और अनुरोध के लिए url का उपयोग करने की कोशिश कर रहा है और जो सही समय पर कैश को साफ़ कर रहा है।

मुझे लगता है कि कहानी की नैतिकता यहां लाइब्रेरी के साथ काम करना है और सभी अच्छी तरह से होगी ... किसी भी कीड़े या अपूर्ण सुविधाओं को छोड़कर, लेकिन एंगुलर में से कोई भी नहीं है;)

ps यह सब AngularJS 1.2.0 पर चल रहा है।


2
हां, मैं समझता हूं और स्वीकार करता हूं कि "सामान्य" स्थितियों में कोणीय संसाधन जानता है कि कैश को कैसे और कब अमान्य करना है, और यह पूरी तरह से काम करता है। लेकिन मेरा उपयोग का मामला थोड़ा अलग था: मैं एक ताज़ा करने के लिए मजबूर करना चाहता था क्योंकि कोणीय को यह जानने का कोई तरीका नहीं था कि ताज़ा करने की आवश्यकता है - उपयोगकर्ता ऑब्जेक्ट को कोणीय ऐप के बाहर संशोधित किया जा रहा है।
एलेक्जेंडर बुल्टे

3
किसी को भी इंगित कर सकते हैं जहां यह प्रलेखित है? मैंने इसके बारे में स्टैक ओवरफ्लो पर पहले पढ़ा है, लेकिन प्रलेखन में इसका कोई उल्लेख नहीं मिल सकता है। मैंने इसे अपने ऐप में भी आज़माया है, लेकिन शायद रास्ते में कुछ गलत किया है ...
सुनील डी।

1
यह हालांकि $ डिलीट के साथ काम करने के लिए प्रकट नहीं होता है। अगली कॉल फिर से कैश से खींची जाएगी और हटाए गए आइटम फिर से दिखाई देंगे। क्या कोई पुष्टि कर सकता है?
लुकस

यह ngResource से काम नहीं करेगा। HANDLE कैश अमान्य न करें उदाहरण के लिए यहाँ जाएँ: stackoverflow.com/questions/25117388/…
HugoPoi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.