2015-04-12 6 views
6

so come fare la cache eliminato per la vista:ionico: esiste un modo per eliminare la cache nel metodo controller?

.state('app.list', { 
    cache : false, 
    url: "/lists/:listId", 
    views: { 
     'menuContent': { 
     templateUrl: "templates/listDashboard.html", 
     controller: 'listDashboardCtrl' 
     } 
    } 
    }) 

, ma ho bisogno di qualcos'altro - eliminare tutte le cache per l'applicazione in modalità di controllo. come farlo?

+0

http://stackoverflow.com/a/33964486/3561568 Si prega di vedere la mia altra risposta. soluzioni piuttosto semplici $ ionicHistory.clearCache() ora restituisce la promessa in modo da poter garantire che la cache sia deselezionata –

risposta

2

È possibile utilizzare $ ionicHistory. From documentation:

clearcache()

Rimuove tutte le visualizzazioni memorizzate nella cache all'interno di ogni ionNavView. Questo rimuove l'elemento view dal DOM e lo distrugge.

Nella tua listDashboardCtrl scrivere questo:

function listDashboardCtrl($scope, $ionicHistory){ 
    $ionicHistory.clearCache(); 
} 
+2

Non funziona. Nella mia app chiamo $ ionicHistory.clearCache() dopo che l'utente si è disconnesso. Quando il prossimo utente accede, i vecchi dati sono ancora lì nella vista. –

+0

Ho lo stesso problema, hai trovato qualche soluzione? @AndroidNoob –

+1

Sì, l'ho capito un po 'di tempo fa. Nella mia pagina di accesso, ho inserito i metodi di cancellazione della cronologia/cache all'interno del blocco $ scope. $ On ('ionicView.enter', ...). –

13

ho trovato una soluzione, avvolgere il clearCache e ClearHistory in un $timeout. Qualcosa come questo.

$scope.logout = function(){ 
     $location.path('/signin') 
     $timeout(function() { 
      $ionicHistory.clearCache(); 
      $ionicHistory.clearHistory(); 
      $log.debug('clearing cache') 
     },300) 
} 

Modifica: Cambiato Timeout secondi

+0

Questo ha funzionato per me. È così strano che questo debba essere fatto ... Ho dato il mio solo un timeout di 100 millisecondi e funziona perfettamente. –

+0

Grande ha funzionato per me! – VizardCrawler

+0

Ha funzionato per me senza il 300. – nima

0

Beh questo è un vecchio problema, ma per chiunque che sta arrivando 2.017 o poi vi spiegherò ciò che realmente accade e come risolverlo:

Il codice di $ ionicHistory.clearCache():

clearCache: function(stateIds) { return $timeout(function() { 
$ionicNavViewDelegate._instances.forEach(function(instance) { 
instance.clearCache(stateIds); }); }); } 

Quindi, come si può vedere, ci vuole 1 parametri cllaed stateIds che è un array di stateId. Effettivamente ho faticato a scoprire che lo stato di Ii non è altro che lo statoNome.

Quindi, andiamo più in profondità. Il codice di $ ionicNavView.clearCache che viene utilizzato nella riga sopra "instance.clearCache (stateIds)" è:

self.clearCache = function(stateIds) { 
    var viewElements = $element.children(); 
    var viewElement, viewScope, x, l, y, eleIdentifier; 

    for (x = 0, l = viewElements.length; x < l; x++) { 
     viewElement = viewElements.eq(x); 

     if (stateIds) { 
     eleIdentifier = viewElement.data(DATA_ELE_IDENTIFIER); 

     for (y = 0; y < stateIds.length; y++) { 
      if (eleIdentifier === stateIds[y]) { 
      $ionicViewSwitcher.destroyViewEle(viewElement); 
      } 
     } 
     continue; 
     } 

     if (navViewAttr(viewElement) == VIEW_STATUS_CACHED) { 
     $ionicViewSwitcher.destroyViewEle(viewElement); 

     } else if (navViewAttr(viewElement) == VIEW_STATUS_ACTIVE) { 
     viewScope = viewElement.scope(); 
     viewScope && viewScope.$broadcast('$ionicView.clearCache'); 
     } 

    } 
}; 

E come si può vedere nel codice, questo clearcache non cancella tutte le cache, invece, distrugge tutte le viste memorizzate nella cache che corrisponde a un valore nell'array stateIds. Se non c'è alcun parametro, ESEGUI PROPRIO LA VISIONE EFFETTIVA.

Quindi la soluzione per questo, utilizzando solo il modo ionico è chiamare $ ionicHistory.clearCache() con tutti i nomi di stato in un array come parametro.

E.g: $ ionicHistory.clearCache (['login', 'mappa', 'casa']); Non riesco a credere che nessuno sviluppatore ionico non abbia scavato nel codice prima, o abbia perso questo semplice datail. Spero che qualcuno ne approfitti, anche se è così in ritardo.

UPDATE: Giusto per rendere cristallino, voglio indicare dove l'insetto è di per sé (se così si può dire bug), forse può essere utile per gli sviluppatori:

self.clearCache = function (stateIds) {

[...]

var viewElements = $element.children(); 

} Che l'intera funzione non è fondamentalmente:

ottenere tutti gli elementi utilizzando JQLite Loop elementi Controllare se un elemento è uguale a quella della matrice StateIds e distruggerla; vai al prossimo elemento. Controlla se l'elemento nel loop è memorizzato nella cache o attivo, e in entrambi i casi reali lo distrugge Non approfondirò questo aspetto, ma eseguendo il debug posso vedere che gli elementi ottenuti da var viewElements = $ element.children(); non è un array di tutti i contenuti delle tue visualizzazioni, nemmeno quelli memorizzati nella cache, intenzionalmente o meno che non eseguono il loop di tutti gli stati per cancellare tutti quelli che corrispondono a "ACTIVE" o "CACHED". Se vuoi che passi in loop TUTTI i tuoi stati e distruggi tutte le viste ei dati memorizzati nella cache devi passare in modo esplicito il parametro array stateIds.

Inoltre c'è un altro strano comportamento, perché quando eseguivo il debug ho visto che l'array var viewElements era pieno di 2 elementi, e questi 2 elementi erano dello stesso stato, uno risolto in 'CACHED' un altro resolver in ' ACTIVE ', anche risolvendo i 2 tipi usati nelle condizioni if ​​la cache non è stata cancellata del tutto.

Personalmente penso che questo sia un po 'sbagliato implementato o largamente utilizzato in modo errato. Il fatto è che ci sono un sacco di persone che si scervellano e gli sviluppatori non danno nemmeno questa semplice spiegazione.

Problemi correlati