J'ai un problème avec la mise en cache des partiels dans AngularJS.
Dans ma page HTML, j'ai:
<body>
<div ng-view></div>
<body>
où mes partiels sont chargés.
Lorsque je modifie le code HTML dans mon partiel, le navigateur charge toujours les anciennes données.
Y a-t-il une solution de contournement?
caching
angularjs
browser-cache
Mennion
la source
la source
app.config.update(SEND_FILE_MAX_AGE_DEFAULT=0)
à monflask_app.py
. (J'imagine que des choses similaires existent pour d'autres serveurs Web).Ctrl+Shift+R
(c'est-à-dire Hard Reload) et quel que soit le mécanisme de mise en cache utilisé, Chrome l'ignorera et récupérera tous les scripts, feuilles de style, etc.ng-include
|ng-view
|templateUrl
ne sont pas traités par ce raccourciRéponses:
Pour le développement, vous pouvez également désactiver le cache du navigateur - Dans Chrome Dev Tools en bas à droite, cliquez sur l'engrenage et cochez l'option
Mise à jour: dans Firefox, il y a la même option dans Debugger -> Paramètres -> Section avancée (vérifié pour la version 33)
Mise à jour 2: Bien que cette option apparaisse dans Firefox, certains rapports indiquent qu'elle ne fonctionne pas. Je suggère d'utiliser Firebug et de suivre la réponse de hadaytullah.
la source
En s'appuyant un peu sur la réponse de @ Valentyn, voici une façon de toujours vider automatiquement le cache chaque fois que le contenu ng-view change:
la source
Comme mentionné dans les autres réponses, ici et ici , le cache peut être effacé en utilisant:
Cependant, comme suggéré par gatoatigrado dans le commentaire , cela ne semble fonctionner que si le modèle html a été servi sans en-têtes de cache.
Donc ça marche pour moi:
En angulaire:
Vous pouvez ajouter des en-têtes de cache de différentes manières, mais voici quelques solutions qui fonctionnent pour moi.
Si vous utilisez
IIS
, ajoutez ceci à votre web.config:Si vous utilisez Nginx, vous pouvez l'ajouter à votre configuration:
Éditer
Je viens de réaliser que la question mentionnait la
dev
machine mais j'espère que cela peut encore aider quelqu'un ...la source
Si vous parlez de cache qui a été utilisé pour la mise en cache de modèles sans recharger la page entière, vous pouvez le vider par quelque chose comme:
Et en balisage:
<button ng-click='clearCache()'>Clear cache</button>
Et appuyez sur ce bouton pour vider le cache.
la source
Solution pour Firefox (33.1.1) utilisant Firebug (22.0.6)
la source
Cet extrait m'a aidé à me débarrasser de la mise en cache des modèles
Les détails de l'extrait suivant peuvent être trouvés sur ce lien: http://oncodesign.io/2014/02/19/safely-prevent-template-caching-in-angularjs/
la source
if (!current) { return; }
Je poste ceci juste pour couvrir toutes les possibilités car aucune des autres solutions n'a fonctionné pour moi (ils ont jeté des erreurs en raison des dépendances du modèle angular-bootstrap, entre autres).
Pendant que vous développez / déboguez un modèle spécifique, vous pouvez vous assurer qu'il est toujours actualisé en incluant un horodatage dans le chemin, comme ceci:
Notez la finale
?nd=' + Date.now()
dans latemplateUrl
variable.la source
.value('DEBUG', true)
pour activer cette ligne ou non..run(function($rootScope) { $rootScope.DEBUG = true; ...
et à l' intérieur de la directive Injecter la rootScope de $ comme.directive('filter', ['$rootScope', function($rootScope)...
et dans l'objet bien retourné:templateUrl: '/app/components/filter/filter-template.html' + ($rootScope.DEBUG ? '?n=' + Date.now() : '')
. Peut-être pourriez-vous élaborer votre approche .value ('DEBUG', true)? A voté!.value('DEBUG', true
est la même que pour$rootScope
, mais sans l'encombrer :) Vous pourrez ensuite injecterDEBUG
dans le contrôleur et interroger en tant que service normal..value(...)
truc, s'il n'est pas trop sophistiqué? Je suppose que le concept derrière est une meilleure pratique angulaire qui m'est inconnue.Comme d'autres l'ont dit, la suppression complète de la mise en cache à des fins de développement peut se faire facilement sans changer de code: utilisez un paramètre de navigateur ou un plugin. En dehors de dev, pour vaincre la mise en cache des modèles angulaires des modèles basés sur l'itinéraire, supprimez l'URL du modèle du cache pendant $ routeChangeStart (ou $ stateChangeStart, pour le routeur d'interface utilisateur), comme l'a montré Shayan. Cependant, cela n'affecte PAS la mise en cache des modèles chargés par ng-include, car ces modèles ne sont pas chargés via le routeur.
Je voulais pouvoir corriger n'importe quel modèle, y compris ceux chargés par ng-include, en production et que les utilisateurs reçoivent le correctif dans leur navigateur rapidement, sans avoir à recharger la page entière. Je ne suis pas non plus préoccupé par la suppression de la mise en cache HTTP pour les modèles. La solution consiste à intercepter toutes les demandes HTTP effectuées par l'application, à ignorer celles qui ne sont pas destinées aux modèles .html de mon application, puis à ajouter un paramètre à l'URL du modèle qui change chaque minute. Notez que la vérification du chemin est spécifique au chemin des modèles de votre application. Pour obtenir un intervalle différent, modifiez le calcul du paramètre ou supprimez complètement le% pour ne pas mettre en cache.
la source
Si vous utilisez un routeur d'interface utilisateur, vous pouvez utiliser un décorateur et mettre à jour le service $ templateFactory et ajouter un paramètre de chaîne de requête à templateUrl, et le navigateur chargera toujours le nouveau modèle à partir du serveur.
Je suis sûr que vous pouvez obtenir le même résultat en décorant la méthode "when" dans $ routeProvider.
la source
J'ai trouvé que la méthode d'intercepteur HTTP fonctionne très bien et permet une flexibilité et un contrôle supplémentaires. De plus, vous pouvez mettre en cache cache pour chaque version de production en utilisant un hachage de version comme variable buster.
Voici à quoi ressemble la méthode dev cachebusting
Date
.la source
Voici une autre option dans Chrome.
Appuyez sur F12pour ouvrir les outils de développement. Ensuite, Ressources > Stockage du cache > Actualiser les caches .
J'aime cette option car je n'ai pas à désactiver le cache comme dans les autres réponses.
la source
Il n'y a pas de solution pour empêcher la mise en cache du navigateur / proxy car vous ne pouvez pas avoir le contrôle dessus.
L'autre façon de forcer un nouveau contenu à vos utilisateurs pour renommer le fichier HTML! Exactement comme https://www.npmjs.com/package/grunt-filerev le fait pour les actifs.
la source
Actualisez le document toutes les 30 secondes:
w3schools HTML http-equiv Attribut
la source