2013-06-12 10 views
90

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

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

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

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

धन्यवाद।

+1

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

+1

के साथ बनाया गया कैश उदाहरण मुझे समान समस्या है लेकिन केवल परीक्षण करते समय। मैं इस बात को ब्राउज़र स्तर पर कैसे रोकूं? – chovy

उत्तर

112

बूलियन रखें और $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') पर कॉल कर सकते हैं। कुंजी को हटाएं (कुंजी), कुंजी के साथ आपके संसाधन का सापेक्ष यूआरएल (उदा:/एपीआई/उपयोगकर्ता/वर्तमान/51a9020d91799f1e9b8db12f)। –

+2

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

+0

@shangxiao यदि यूआरएल को कैश किया गया है तो क्वेरी पैरामीटर हैं, फिर हां, आपको उन्हें 'निकालें() 'कुंजी में निर्दिष्ट करना होगा। सापेक्ष यूआरएल कम से कम 1.2.9 में काम करते हैं। – alalonde

17

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

धन्यवाद। मैंने उसे भी देखा, लेकिन मैं उस रास्ते पर जाने से पहले इसे करने के लिए "मानक" तरीका ढूंढ रहा था ... –

+1

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

+1

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

7

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

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

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

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

यदि आप सूची प्लेयर्स को कई बार कॉल करते हैं, तो पहली कॉल http प्राप्त करने का अनुरोध करती है और सभी बाद की कॉल कैश की जाती हैं। यदि आप ऐडप्लेयर को कॉल करते हैं, तो एक http पोस्ट अपेक्षित के रूप में किया जाता है, और फिर सूची के लिए अगली कॉल प्लेयर्स http प्राप्त (कैश नहीं) करेगा।

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

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

पी.एस. यह सब AngularJS 1.2.0 पर चल रहा है।

+2

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

+3

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

+1

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

संबंधित मुद्दे