Meilleure Façon de Prévenir IE Cache dans AngularJS?
J'utilise actuellement le service/$de ressources pour faire des appels ajax (OBTENIR dans ce cas), et IE met en cache les appels pour que de nouvelles données ne peuvent être récupérées à partir du serveur. J'ai utilisé une technique que j'ai trouvé sur google pour créer un nombre aléatoire et l'ajouter à la demande, de sorte que IE n'ira pas en cache pour les données.
Est-il une meilleure façon que l'ajout de la cacheKill à chaque requête?
code usine
.factory('UserDeviceService', function ($resource) {
return $resource('/users/:dest', {}, {
query: {method: 'GET', params: {dest: "getDevicesByUserID"}, isArray: true }
});
Appel à partir du contrôleur de
$scope.getUserDevices = function () {
UserDeviceService.query({cacheKill: new Date().getTime()},function (data) {
//logic
});
}
- J'ai ajouté Pas-en-têtes de Cache sur le côté serveur et il a travaillé pour l'instant.
- Ufuk, qui semble être le moyen le plus efficace de faire prendre en charge le problème "à l'échelle mondiale" ou plus de manière évolutive, sans avoir à faire tous les ajax/appel RESTE unique. Vous devez répondre à la question, donc je peux le marquer comme réponse! Vous méritez le crédit.
- BTW, je suis l'aide d'un noeud/express pour le serveur web, et j'ai accompli ce que Ufuk recommandé en ajoutant le code suivant à exprimer config: app.utilisation(fonction noCache(req, res, next){ res.header("Cache-Control", "no-cache, pas de magasin, must-revalidate"); res.header("Pragma", "no-cache"); res.header("Expires",0); next(); })
Vous devez vous connecter pour publier un commentaire.
Comme binarygiant demandé-je suis de poster mon commentaire comme une réponse. J'ai résolu ce problème en ajoutant No-Cache-têtes de la réponse sur le côté serveur. Notez que vous avez à faire cela pour les requêtes GET seulement, d'autres demandes semble bien fonctionner.
binarygiant posté comment vous pouvez le faire sur le nœud/express. Vous pouvez le faire dans ASP.NET MVC comme ceci:
Comme décrit dans l'un de mes autres postes, vous pouvez désactiver la mise en cache à l'échelle mondiale dans le $httpProvider:
$httpProvider.defaults.headers.get['Pragma'] = 'no-cache';
il est donc possible de modifier cette ligne pour$httpProvider.defaults.headers.get.Pragma = 'no-cache';
Pour ceux qui l'utilisent ASP.NET Web API 2 la solution équivalente, ne serait-ce (API Web ne pas utiliser la même mise en cache de la logique MVC):
puis l'attacher dans WebApiConfig.cs:
if(actionExecutedContext.Request.Method.Method == "GET")
dans leOnActionExecuted
événement pour en faire seulement le feu sur les requêtes GETactionExecutedContext.Request.Method == HttpMethod.Get
Permettant noCache dans l'est de l'instance était le meilleur moyen pour y parvenir:
Dans node/express cela fonctionne pour prévenir c'est à dire de mise en cache de ces demandes:
vous pouvez ajouter un intercepteur pour générer unique url de la requête. Aussi, vous pouvez supprimer de la console.journal des appels
config.params = config.params || []
puis ajouter par défaut désactiver le paramètreconfig.params['noCache'] = new Date().getTime();
Je reçois une réponse par:
Koajs équivalent de binarygiant réponse:
Bien que cette approche:
Est correcte, '0' n'est pas une valeur valide pour le Si-Modified-since-tête. Il doit être valide HTTP date, par exemple:
Selon la spec:
Donc mieux être prudent que désolé et utiliser une date dans le passé.
Si vous avez aucun contrôle sur la sortie du serveur, il serait préférable de ne pas ajouter de mise en cache des en-têtes à la place.
Ma solution était d'ajouter
Cache-Control: no-cache
en-tête sur le serveur, plus l'ajout d'$templateCache.remove()
avant de changer d'état. Je suis à l'aide d'angular-ui/ui-router. J'ai eu des problème avec IE11 et le Bord du navigateur.Une solution évidente consiste à utiliser une url unique. Mais comment le routeur url changé de poste d'initialisation
Désactiver les caches du navigateur n'est pas une option, car nous en avons besoin pour les opérations normales.
Vous pouvez supprimer des modèles de la $templateCache lorsque ceux-ci sont pas de
plus nécessaire.
(http://docs.angularjs.org/api/ng.$templateCache).
Ces nouvelles sont ajoutées à la cache dès que le téléchargement est terminé.