cache javascript ionic

javascript - cache - ¿Es posible borrar el caché de vista en Ionic?



clear cache ionic 3 (5)

¿Estás buscando algo como esto ?:

$ionicHistory.clearCache();

EDITAR:

Hay un problema en el github de Ionic: Issue

Actualmente estoy trabajando en un proyecto de Angular / Ionic / Cordova y recientemente nos hemos actualizado a la última versión beta de Ionic. De la versión que el proyecto estaba usando antes, esto introdujo el caché de vista. Sin embargo, también ha introducido un problema al hacerlo.

La aplicación está orientada al cliente y está muy centrada en los datos. Sin embargo, un usuario debe autenticarse para ver los datos asociados con su cuenta; cuando un usuario cierra la sesión y se registra en otra cuenta, debido a que las vistas todavía están almacenadas en caché, se presentan con las vistas de la última cuenta.

La aplicación aún debe almacenar en caché las vistas cuando el usuario está conectado, ya que ayuda a que la aplicación se sienta mucho más rápida, pero la caché se debe purgar cuando un usuario cierra la sesión.

Establecer cache-view="false" no es una opción, ya que deshabilitaría completamente la caché.

También intenté configurar $ionicConfig.views.maxCache(0); y luego vuelve al valor predeterminado de 10 con la esperanza de que purgue la caché al hacerlo, pero no tuvo ningún efecto.

Lo último que se me ocurre hacer es disparar un evento cuando un usuario inicia sesión que actualiza todos los datos que están cargados actualmente en las vistas; sin embargo, esto requeriría un poco más de esfuerzo del que creo que debería.

¿Hay alguna manera de borrar el caché de vista?


Bueno, este es un viejo problema, explicaré lo que realmente sucede y cómo resolverlo:

PD: si quieres ir directamente a la SOLUCIÓN simplemente desplázate hacia abajo de inmediato.

El código de $ ionicHistory.clearCache ():

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

Entonces, como puede ver, se necesita 1 parámetro cllaed stateIds que es una matriz de stateId. De hecho, tuve problemas para descubrir que stateId no es más que StateName.

Entonces, vayamos más profundo. El código de $ ionicNavView.clearCache que se utiliza en la línea de arriba "instance.clearCache (stateIds)" es:

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''); } } };

Y como puede ver en el código, este clearCache NO BORREA TODAS LAS CACHES, en su lugar, destruye todas las vistas en caché que coincidan con un valor en la matriz stateIds. Si no hay ningún parámetro, SOLO DESTRUIRÁ LA VISTA REAL.

Entonces, la solución para esto, usando solo la forma jónica es llamar a $ ionicHistory.clearCache () con todos los nombres de sus estados en una matriz como parámetro.

Ejemplo: SOLUCIÓN $ ionicHistory.clearCache ([''login'', ''map'', ''home'']); No puedo creer que ningún desarrollador de Ionic haya profundizado en el código antes, ni haya pasado por alto este simple dato. Hay mucha gente que está sufriendo por esto.

Solo para dejarlo en claro, quiero señalar dónde está el error en sí (si podemos llamarlo error), tal vez puede ser útil para los desarrolladores:

self.clearCache = function (stateIds) {

[...]

var viewElements = $element.children();

} Lo que la función completa es básicamente:

Obtener todos los elementos usando JQLite Loop the elements Compruebe si un elemento es igual a uno en la matriz StateIds y destrúyalo; ve al siguiente elemento. Comprueba si el elemento en el bucle está en caché o activo, y en ambos casos verdaderos, destrúyelo. No profundizaré en esto, pero al depurarlo pude ver que los elementos se obtuvieron de var viewElements = $ element.children (); no es una matriz de todos sus contenidos de vistas, ni siquiera los almacenados en caché, intencionalmente o no, no recorre todos sus estados para borrar todos aquellos que coinciden con ''ACTIVE'' o ''CACHED''. Si desea que pase por TODOS sus estados y destruya todas las vistas y datos almacenados en caché, debe pasar explícitamente el parámetro de matriz stateIds.

Además de eso hay otro comportamiento extraño, porque cuando lo estaba depurando vi cuando la matriz var viewElements se llenó con 2 elementos, y estos 2 elementos eran del mismo estado, uno resolvió ''CACHED'' otro resolver a ''ACTIVO'', incluso resolviendo los 2 tipos utilizados en las condiciones if, el caché no se borró en absoluto.

Personalmente creo que esto es algo mal implementado o que se usa ampliamente de manera incorrecta. El hecho es que hay muchas personas que piensan en esto y los desarrolladores ni siquiera dan esta explicación simple.


En la definición de estado en app.js, puede agregar cache:false para deshabilitar el almacenamiento en caché (consulte Deshabilitar el caché dentro del proveedor de estado en los documentos Ionic. O puede guardar el almacenamiento en caché, excepto cuando sepa que los datos han cambiado.

  • Si ya está en la página, puede hacer, $state.go($state.currentState, {}, {reload:true})
  • Si está en otro estado y desea volver al estado que normalmente está en la memoria caché pero desea que se actualice, puede hacer, $ionicHistory.clearCache().then(function(){ $state.go(''app.fooState'') })

Tenga en cuenta que este último requiere clearCache para devolver una promesa. Vea los cambios que hice en esta solicitud de extracción y compare la implementación de clearCache que tiene ahora con la mía: https://github.com/driftyco/ionic/pull/3724


Me encontré con un escenario similar en el que el inicio de sesión con otro usuario me mostraba una vista obsoleta / en caché. Puede hacer que la cache: false en el nivel de definición de estado, pero eso deshabilita completamente la caché para ese estado en su aplicación.

Lo que puede hacer es borrar toda la vista en caché y el historial cuando el usuario ingrese el estado de inicio de sesión / inicio de sesión de su aplicación (como usted dijo). Parece ideal.

// code inside your signin controller $scope.$on("$ionicView.enter", function () { $ionicHistory.clearCache(); $ionicHistory.clearHistory(); });


También puede hacerlo estableciendo el cache:false en su $stateProvider :

$stateProvider.state(''myState'', { cache: false, url : ''/myUrl'', templateUrl : ''my-template.html'' })