210 votes

AngularJS désactive la mise en cache partielle sur la machine de développement

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.

Quand je change le code html dans mon partiel, le navigateur charge toujours les anciennes données.

Y a-t-il une solution de rechange ?

Merci

201voto

LukeSolar Points 955

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.

Désactiver le cache (pendant que DevTools est ouvert)

Mise à jour : Dans Firefox il y a la même option dans Debugger -> Settings -> Advanced Section (vérifié pour la version 33)

111voto

Mark Rajcok Points 85912

En s'appuyant un peu sur la réponse de @Valentyn, voici un moyen de toujours vider automatiquement le cache à chaque fois que le contenu du ng-view est modifié :

myApp.run(function($rootScope, $templateCache) {
   $rootScope.$on('$viewContentLoaded', function() {
      $templateCache.removeAll();
   });
});

37voto

Chris Foster Points 792

Comme mentionné dans les autres réponses, ici et ici le cache peut être effacé en utilisant :

$templateCache.removeAll();

Toutefois, comme le suggère gatoatigrado dans le commentaire cela ne semble fonctionner que si le modèle html a été servi sans aucun en-tête de cache.

Donc ça marche pour moi :

En angulaire :

app.run(['$templateCache', function ( $templateCache ) {
    $templateCache.removeAll(); }]);

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 :

<location path="scripts/app/views">
  <system.webServer>
    <staticContent>
      <clientCache cacheControlMode="DisableCache" />
    </staticContent>
  </system.webServer>
</location>

Si vous utilisez Nginx, vous pouvez ajouter ceci à votre configuration :

location ^~ /scripts/app/views/ {
    expires -1;   
}

Modifier

Je viens de réaliser que la question mentionnée dev mais j'espère que cela pourra quand même aider quelqu'un...

31voto

Valentyn Shybanov Points 8483

Si vous parlez du cache qui est utilisé pour la mise en cache des modèles sans recharger la page entière, vous pouvez le vider en utilisant une méthode comme celle-ci :

.controller('mainCtrl', function($scope, $templateCache) {
  $scope.clearCache = function() { 
    $templateCache.removeAll();
  }
});

Et dans le balisage :

<button ng-click='clearCache()'>Clear cache</button>

Et appuyez sur ce bouton pour vider le cache.

19voto

Shayan Husaini Points 2698

Cet extrait m'a aidé à me débarrasser de la mise en cache des modèles.

app.run(function($rootScope, $templateCache) {
    $rootScope.$on('$routeChangeStart', function(event, next, current) {
        if (typeof(current) !== 'undefined'){
            $templateCache.remove(current.templateUrl);
        }
    });
});

Les détails de l'extrait suivant peuvent être trouvés sur ce lien : http://opensourcesoftwareandme.blogspot.com/2014/02/safely-prevent-template-caching-in-angularjs.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X