¿Es posible cambiar dinámicamente qué módulo se carga de forma diferida en función de una bandera? Por ejemplo, quiero cargar el módulo A si la bandera está habilitada, de lo contrario, cargar el módulo B. El requisito clave es que debe usar la misma path , independientemente del módulo que se cargue.
Intento n.º 1: carga dinámica de niños ()
// Use a service to get the flag. This service would be injected somewhere? let someFlag = this.someService.getFlagValue(); const routes: Routes = [ { path: 'routeA', loadChildren: () => { if (someFlag === true) { return import('./A.module').then(m => m.ModuleA); } else { return import('./B.module').then(m => m.ModuleB); } } } ]; Sin embargo, esto solo arroja un error al cargar la ruta: Error: Uncaught (in promise): Error: Runtime compiler is not loaded
Intento #2 - canActivate guard para reemplazar loadChildren
const routes: Routes = [ { path: 'routeA', canActivate: [CanActivateFeatureFlagGuard], loadChildren: () => import('./A.module').then(m => m.ModuleA), data: { REPLACE_WITH: () => import('./B.module').then(m => m.ModuleB), preload: false } } ]Esto arroja un error de compilación:
Function expressions are not supported in decorators in 'routes' 'routes' contains the error at routing.module.tsrefiriéndose a la línea con REPLACE_WITH.
¿Hay alguna forma conocida (quizás con un protector CanActivate) de afectar qué módulo está cargado?
Actualización: encontréeste repositorio que parecía prometedor, pero al implementarlo aparece el error: ERROR in Cannot read properties of undefined (reading 'loadChildren')
Puedes hacerlo así:
const routes: Routes = [ { path: '', loadChildren: () => someFlag === true ? import('./new.module').then(m => m.NewModule) : import('./legacy.module').then(m => m.LegacyModule) } ];