Actualmente estoy trabajando en una aplicación de una sola página. en la página principal se muestran varias tarjetas. Estas tarjetas pueden estar habilitadas o deshabilitadas. Si está deshabilitado, solo se muestra el título de la tarjeta. Si está habilitado, se muestra el título más el contenido (que se carga de forma diferida) de la tarjeta. De forma predeterminada, todas las tarjetas se muestran y deshabilitan. Según el dossier del usuario, algunas tarjetas pueden estar activas al cargar la página.
Actualmente, no configuré ninguna estrategia de precarga, por lo tanto, al cargar la página, solo se carga el contenido de la tarjeta activa.
He intentado configurar preloadingStrategy para preloadAllModules, funciona bien, pero ralentiza el inicio de la aplicación. En realidad, el contenido de las tarjetas activas aparece más lento ya que todos los módulos se cargan al mismo tiempo.
=> Lo que quiero es: 1. cargar la aplicación 2. cargar el contenido de todas las tarjetas activas 3. precargar todos los demás módulos que no se muestran al inicio
=> Algún tipo de retraso en la precarga después del primer renderizado
=> ¿Crees que es posible?
Gracias de antemano por su colaboración
Solución del problema
Creo que es posible, tienes que hacer una estrategia de precarga personalizada:
Puede actualizar la configuración de su enrutador raíz de esta manera:
@Injectable({
providedIn: 'root'
})
export class CustomPreload implements PreloadingStrategy {
preload(route: Route, load: () => Observable<any>): Observable<any> {
// you implement this function somewhere, somehow
if (isActiveCardRoute(route)) {
// this will make it load immediately
return load();
} else {
/*
* this will load the remaining modules after 5 seconds. You can possibly make a more
* 'complex' logic to have it load sequentially or in bigger intervals to make sure
* the app doesn't lag when loading
*/
return timer(5000).pipe(
switchMap(() => load())
)
}
}
}
Si de alguna manera necesita averiguar antes de esto, si una tarjeta está activa o no cargando la API/iniciar sesión. Debe agregar esta lógica al APP_INITIALIZER
, o supongo que también puede agregarla al CustomPreload
inyectar el apropiado servicios.
Esto CustomPreload
, lo puedes agregar a tu RouterConfig
:
RouterModule.forRoot(AppRoutes, {
preloadingStrategy: CustomPreload
});
No hay comentarios.:
Publicar un comentario