2012-11-19 23 views
32

Sto lavorando a un'app AngularJS con diverse direttive. I modelli della direttiva sono memorizzati in un file html separato. Durante la modifica di questo modello, il mio browser non rileva alcuna modifica dopo una ricarica e utilizza sempre una versione memorizzata nella cache. Eventuali altre modifiche al codice sorgente vengono rilevate e portano a una ricarica.Caricamento forzato del modello di una direttiva

Suppongo che il problema sia in qualche modo il $ templateCache che sembra essere utilizzato da AngularJS durante il caricamento del modello.

Quello che ho trovato nel codice sorgente di AngularJS 1.0.2 è la seguente dalla linea 4317 che fa parte del compileTemplateUrl():

$http.get(origAsyncDirective.templateUrl, {cache: $templateCache}) 

Mi chiedo se qualcun altro ha avuto questo tipo di problema e se c'è un modo per dire ad AngularJS quando cache e quando no.

risposta

15

La cache del modello è memorizzata nel browser in quanto si tratta di un'app javascript. È possibile alimentare manualmente la cache $ o impedire al browser di memorizzare nella cache i modelli (come sembrerebbe che per la produzione, la cache non costituisca un problema), utilizzando gli strumenti di sviluppo.

Per alimentazione forzata cache:

vedere che funziona in questo fiddle.

per evitare che il browser da caching dei modelli (citati da questo Google Groups post, su questo problema, esattamente):

mio team ed io sono imbattuto in questo stesso problema. La nostra soluzione per lo sviluppo di durante l'utilizzo di Chrome doveva aprire gli Strumenti per sviluppatori e selezionare l'ingranaggio nell'angolo in basso a destra. Quindi selezionare Rete - Disabilitare la cache.

Questo ha risolto tutti i problemi di cache parziale/modello.

+14

Essa in realtà non risolvere il mio problema di disabilitare la cache in cromo per la mia versione cromata locale come utente che navigare il sito ancora caricare la cache versione. –

+2

(Ci scusiamo per il doppio commento ma non sono riuscito a modificarlo più ...) Forzare la cache per ricaricare il modello ogni volta sembra un hack per me. Ma immagino di non avere scelta. Disabilitare il caching in chrome per la mia versione locale di Chrome risolve il problema solo per me.Altri visitatori che visitano il sito Web caricano ancora la versione cache. Gli aggiornamenti in modalità di produzione non sono quindi visibili finché l'utente non cancella la cache. –

+0

Bene, io uso Yeoman per i miei progetti angularJS, quindi i file distribuiti hanno il loro nome hash come prefisso. Ciò rende la cache non proprio un problema, poiché qualsiasi modifica fondamentale all'app viene immediatamente riconosciuta (i file hanno nomi diversi). Per i test, uso anche Yeoman e costringe a ricaricare tutte le risorse. –

36

So che questa è una vecchia domanda, ma qui c'è una soluzione più semplice, anche se è un po 'un trucco, funziona per me e non richiede di fare nulla per $ templateCache.

Ogni volta che mi imbatto in questo problema (lo vedo nei modelli direttivi, ma anche i file JSON statici), aggiungo un parametro di query al fine dell'URL viene caricato, in questo modo:

... 
templateUrl: "partials/template.html?1", 
... 

Ogni volta Apporto una modifica al modello e non si ricarica, incremento quel numero alla fine. Poiché il browser non sa se questo potrebbe significare qualcosa di speciale per il server, dovrebbe tentare di ricaricare l'URL modificato indipendentemente dal fatto che sia memorizzato nella cache o meno. Ciò assicurerà inoltre che il file venga ricaricato nell'ambiente di produzione.

+7

E se hai molti modelli puoi usare una variabile var v = "1"; $ routeProvider.when ('/', {templateUrl: '/pages/home.html?v=' + v, controller: 'HomeCtlr'}); – dpineda

+1

'" partials/template.html? " + Date.now() 'ha funzionato perfettamente per me. – mhodges

1
app.controller('someCtrl', function ($scope, $cacheFactory, templateRequest) 
{ 
    $scope.refreshTemplate = function() 
    { 
     var tpl = "<template name>"; 
     $cacheFactory.get('templates').remove(tpl); 
     $templateRequest(tpl).then(function ok(){ 
      console.log("Template "+tpl+" loaded."); 
     }); 
    } 
    ... 
    } 

poi quando si chiama la funzione refreshTemplate si causa un re-load

+0

Non so perché questa non è la risposta accettata ... Funziona come previsto ... – Scriptlabs

Problemi correlati