24

में कॉल प्राप्त करें मेरे पास एक बाकी एंडपॉइंट है जो एक जीईटी कॉल पर एक सूची देता है। मेरे पास नए आइटम जोड़ने और उन्हें हटाने के लिए एक डिलीट जोड़ने के लिए एक पोस्ट एंडपॉइंट भी है। यह फ़ायरफ़ॉक्स और क्रोम में काम करता है, और आईई 11 में पोस्ट और डिलीट काम करता है। हालांकि, आईई 11 में जीईटी केवल पृष्ठ के शुरुआती लोड पर काम करता है। रिफ्रेशिंग रिटर्न कैश डेटा। मैंने कोणीय 1 में इस व्यवहार के बारे में पोस्ट देखा है लेकिन कोणीय 2 (रिलीज उम्मीदवार 1) के लिए कुछ भी नहीं है।आईई 11 कैशिंग को रोकें कोणीय 2

+3

अपने GET API ऐसी किसी भी कैश नियंत्रण हेडर निर्दिष्ट नहीं करता है प्रदान करते हैं -> इसका मतलब प्रतिक्रिया संचित करने योग्य है स्थिति 200 ठीक है अगर। – Loc

+3

क्लाइंट साइड वर्कअराउंड के लिए http://stackoverflow.com/questions/36500804/proper-way-to-prevent-angular2-http-request-caching-in-internet-explorer-ie भी देखें। –

+0

@ लॉक मैंने कैश-कंट्रोल वैल्यू नो-स्टोर और नो-कैश जोड़ा और अभी भी आईई में एक ही परिणाम प्राप्त करें। – cmaynard

उत्तर

17

रूप here उत्तर दिया, तुम सिर्फ RequestOptions भी पार कर जाते हेडर को जोड़ने के लिए की जरूरत:

import { Injectable } from '@angular/core'; 
import { BaseRequestOptions, Headers } from '@angular/http'; 

@Injectable() 
export class CustomRequestOptions extends BaseRequestOptions { 
    headers = new Headers({ 
     'Cache-Control': 'no-cache', 
     'Pragma': 'no-cache', 
     'Expires': 'Sat, 01 Jan 2000 00:00:00 GMT' 
    }); 
} 

मॉड्यूल:

@NgModule({ 
    ... 
    providers: [ 
     ... 
     { provide: RequestOptions, useClass: CustomRequestOptions } 
    ] 
}) 
+1

यह कोणीय अनुरोध कैश से सभी अनुरोध करने के लिए एक अच्छा समाधान है, हालांकि मैं सभी अनुरोधों के लिए यह व्यवहार नहीं चाहता क्योंकि कुछ अनुरोधों को ठीक से कैश किया जा सकता है। मैं उचित शीर्षलेख सर्वर पक्ष स्थापित करने के साथ चला गया। मैं सर्वर के पास कैशिंग स्मारक वैसे भी होगा। मैंने सवाल को खराब तरीके से कहा होगा। – cmaynard

+1

@cmaynard मैंने एंडुलर के लिए ग्लोबल कैशिंग सेट अप करने के तरीके को देखते हुए अपने प्रश्न में संघर्ष किया, इसलिए Google परिप्रेक्ष्य से आपका शब्द कुछ लोगों की खोज के लिए बिल्कुल सही है :) –

6

स्टैक ओवरफ्लो प्रतिक्रिया Angular IE Caching issue for $http अग्रेषित करें, आपको प्रत्येक 'GET' अनुरोध के लिए हेडर 'प्रगमा', 'नो-कैश', 'अगर-संशोधित-चूंकि' जोड़ना चाहिए।

इंटरसेप्टर का परिदृश्य अब कोणीय 2 के लिए समर्थित नहीं है। इसलिए आपको http का विस्तार करना चाहिए क्योंकि इसे यहां वर्णित किया गया है What is httpinterceptor equivalent in angular2?

कोणीय 4.3 में अब HttpClient सेवा शामिल है, जो इंटरसेप्टर का समर्थन करता है।

0

थोड़ा देर हो चुकी है, लेकिन मैं एक ही समस्या में भाग गया। कोणीय 4.X के लिए मैंने आईई द्वारा कैशिंग को रोकने के लिए अंत में एक यादृच्छिक संख्या जोड़ने के लिए एक कस्टम एचटीपी कक्षा लिखी। यह dimeros (What is httpinterceptor equivalent in angular2?) द्वारा दूसरे लिंक पर आधारित है। चेतावनी: 100% बग मुक्त होने की गारंटी नहीं है।

import { Injectable } from '@angular/core'; 
import { Observable } from 'rxjs/Observable'; 
import { Http, Response, XHRBackend, RequestOptions, RequestOptionsArgs, 
URLSearchParams } from '@angular/http'; 

@Injectable() 
export class NoCacheHttp extends Http { 
    constructor(backend: XHRBackend, options: RequestOptions) { 
     super(backend, options); 
    } 

    get(url: string, options?: RequestOptionsArgs): Observable<Response> { 
     //make options object if none. 
     if (!options) { 
      options = { params: new URLSearchParams() }; 
     } 
     //for each possible params type, append a random number to query to force no browser caching. 
     //if string 
     if (typeof options.params === 'string') { 
      let params = new URLSearchParams(options.params); 
      params.set("k", new Date().getTime().toString()); 
      options.params = params; 

     //if URLSearchParams 
     } else if (options.params instanceof URLSearchParams) { 
      let params = <URLSearchParams>options.params; 
      params.set("k", new Date().getTime().toString()); 

     //if plain object. 
     } else { 
      let params = options.params; 
      params["k"] = new Date().getTime().toString(); 
     } 
     return super.get(url, options); 
    } 
} 
+0

मैंने अतीत में उस तकनीक का उपयोग 'मूर्ख' कैशिंग में किया है। मुझे लगता है कि यह उपयोगी है, लेकिन इसके बजाय उचित हेडर सेट करना बेहतर होता है। – cmaynard

2

आज, मैं भी इस समस्या थी, (आईई लानत) । मेरी प्रोजेक्ट में, मैं httpclient का उपयोग करता हूं, जिसमें BaseRequestOptions नहीं है। हमें इसे हल करने के लिए Http_Interceptor का उपयोग करना चाहिए!

export class CustomHttpInterceptorService implements HttpInterceptor { 
    intercept(req: HttpRequest<any>, next: HttpHandler): 
    Observable<HttpSentEvent | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any>> { 
    const nextReq = req.clone({ 
     headers: req.headers.set('Cache-Control', 'no-cache') 
     .set('Pragma', 'no-cache') 
     .set('Expires', 'Sat, 01 Jan 2000 00:00:00 GMT') 
     .set('If-Modified-Since', '0') 
    }); 

    return next.handle(nextReq); 
} 

मॉड्यूल

@NgModule({ 
    ... 
    providers: [ 
     ... 
     { provide: HTTP_INTERCEPTORS, useClass: CustomHttpInterceptorService, multi: true } 
    ] 
}) 
+0

धन्यवाद, यह कोणीय 5 के लिए सही उत्तर है। हालांकि मैंने मूल प्रश्न में कोणीय 2 निर्दिष्ट किया है कि मैं इस प्रश्न के लिए सही उत्तर चिह्नित कर दूंगा, एक अपवित्र है! – cmaynard

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