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.
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 –