¿Es posible borrar la caché de vista en Ionic?


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

La aplicación está orientada al cliente y está muy centrada en los datos. Un usuario debe autenticarse para ver los datos asociados con su cuenta, sin embargo, actualmente; cuando un usuario cierra sesión y inicia sesión en otra cuenta, porque las vistas aún están 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 inicia sesión, ya que ayuda a que la aplicación se sienta mucho más rápida, pero la caché debe purgarse cuando un usuario cierra sesión.

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

También he intentado establecer $ionicConfig.views.maxCache(0); y luego volver al valor predeterminado de 10 con la esperanza de que purgaría la caché al hacerlo, pero no tuvo ningún efecto.

El último lo que puedo pensar en hacer es disparar un evento cuando un usuario inicia sesión que actualiza todos los datos que se cargan actualmente en las vistas; sin embargo, esto requeriría un poco más de esfuerzo de lo que creo que debería.

¿Hay alguna manera de simplemente borrar la caché de la vista?

Author: Seer, 2015-02-23

5 answers

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

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

Tenga en cuenta que este último requiere que clearCache devuelva un 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

 65
Author: ABCD.ca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-07 13:50:07

Me topé con un escenario similar en el que iniciar sesión con otro usuario me mostraba una vista obsoleta/en caché. Puede hacer 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 ingresa el estado de signin/login de su aplicación (como dijo). Parece ideal.

// code inside your signin controller

$scope.$on("$ionicView.enter", function () {
   $ionicHistory.clearCache();
   $ionicHistory.clearHistory();
});
 19
Author: Nirav Gandhi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-11 14:10:15

También puedes hacerlo configurando cache:false en tu $stateProvider:

$stateProvider.state('myState', {
   cache: false,
   url : '/myUrl',
   templateUrl : 'my-template.html'
})
 8
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-07 14:12:14

Estás buscando algo como esto?:

$ionicHistory.clearCache();

EDITAR:

Hay un problema en el github de Ionic: Cuestión

 4
Author: Andoni Martín,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-24 09:17:37

Bueno, este es un problema antiguo, voy a explicar lo que realmente sucede y cómo resolverlo:

P.d.: Si desea ir directamente a la SOLUCIÓN, desplácese hacia abajo de inmediato.

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

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

Así que, como puede ver, toma 1 parámetro cllaed stateIds que es una matriz de stateId. De hecho, luché para descubrir que stateId no es más que StateName.

Entonces, vayamos más profundo. El código de ion ionicNavView.clearCache que se utiliza en el línea arriba " instancia.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 BORRA TODAS LAS CACHÉS, sino que destruye todas las vistas en caché que coinciden con un valor en la matriz stateIds. Si no hay ningún parámetro, SIMPLEMENTE DESTRUYE LA VISTA REAL.

Así que la solución para esto, usando solo la forma iónica es llamar ion ionicHistory.clearCache () con todos sus nombres de estado en una matriz como parámetro.

Por ejemplo: SOLUCIÓN ion ionicHistory.clearCache (['login','map', "inicio"]); No puedo creer que ningún desarrollador de Ionic no haya profundizado en el código antes, o se haya perdido este simple correo de datos. Hay mucha gente que está ansiosa por esto.

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

Auto.clearCache = function (stateIds) {

[...]

 var viewElements = $element.children();

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

Obtenga todos los elementos usando jqLite Bucle de los elementos Comprobar si un elemento es igual a uno en la matriz StateIds y destruirlo; ir al siguiente elemento. Compruebe si el elemento en el bucle está almacenado en caché o activo, y en ambos casos verdaderos destruirlo No profundizaré en esto, pero depurándolo pude ver que los elementos obtenidos de var viewElements = element element.children(); no es un array de todo el contenido de tus vistas, ni siquiera de las cacheadas, intencionalmente o no no recorre todos tus estados para borrar todos aquellos que coinciden con 'ACTIVE' o 'CACHED'. Si quieres recorra TODOS sus estados y destruya todas las vistas y datos almacenados en caché que necesita para pasar explícitamente el parámetro stateIds array.

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

Yo personalmente piense que esto es algún tipo mal implementado o es ampliamente utilizado incorrectamente. El hecho es que hay un montón de gente rompiéndose la cabeza con esto y los desarrolladores ni siquiera dan esta simple explicación.

 0
Author: Marco Silva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-25 01:19:50