javascript - Angular IE cache-problem for $http
Alle AJAX-kallene som sendes fra IE blir bufret av Angular, og jeg får en 304 response for alle de påfølgende kallene. Selv om forespørselen er den samme, vil ikke svaret være det samme i mitt tilfelle. Jeg ønsker å deaktivere dette bufferet. Jeg prøvde å legge til cache-attributtet til $http.get, men det hjalp fortsatt ikke. Hvordan kan dette problemet løses?
Svar #1
I stedet for å deaktivere caching for hver enkelt GET-forespørsel, deaktiverer jeg det globalt i $httpProvider:
myModule.config(['$httpProvider', function($httpProvider) {
//initialize get if not there
if (!$httpProvider.defaults.headers.get) {
$httpProvider.defaults.headers.get = {};
}
// Answer edited to include suggestions from comments
// because previous version of code introduced browser-related errors
//disable IE ajax request caching
$httpProvider.defaults.headers.get['If-Modified-Since'] = 'Mon, 26 Jul 1997 05:00:00 GMT';
// extra
$httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';
$httpProvider.defaults.headers.get['Pragma'] = 'no-cache';
}]);
Svar #2
Du kan enten legge til en unik spørringstreng (jeg tror dette er hva jQuery gjør med cache: false-alternativet) til forespørselen.
$http({
url: '...',
params: { 'foobar': new Date().getTime() }
})
En kanskje bedre løsning er hvis du har tilgang til serveren, da kan du sørge for at nødvendige headere er satt for å forhindre caching. Hvis du bruker ASP.NET MVC kan dette svaret være nyttig.
Svar #3
du kan legge til en interceptor.
myModule.config(['$httpProvider', function($httpProvider) {
$httpProvider.interceptors.push('noCacheInterceptor');
}]).factory('noCacheInterceptor', function () {
return {
request: function (config) {
console.log(config.method);
console.log(config.url);
if(config.method=='GET'){
var separator = config.url.indexOf('?') === -1 ? '?' : '&';
config.url = config.url+separator+'noCache=' + new Date().getTime();
}
console.log(config.method);
console.log(config.url);
return config;
}
};
});
Du bør fjerne console.log-linjer etter verifisering.
Svar #4
Jeg la bare til tre metatagger i index.html i Angular-prosjektet, og cache-problemet ble løst i IE.
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="Sat, 01 Dec 2001 00:00:00 GMT">
Svar #5
Dupliserer mitt svar i en annen tråd.
For Angular 2 og nyere, er den enkleste måten å legge til no-cache-overskrifter på ved å overstyre 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'
});
}
Og referer til det i modulen din:
@NgModule({
...
providers: [
...
{ provide: RequestOptions, useClass: CustomRequestOptions }
]
})
