[ИСПОЛЬЗОВАНИЕ: Angular 8, Chrome79, Ioni c 4, режим разработки (ioni c serve)]
У меня проблема с моим Angular Router, я включил PreloadAllModules
и в зависимости от того, какой модуль будет первым в моем определении маршрутов, он вызовет ReferenceError: Cannot access 'myModule' before initialization
для другого.
import { NgModule } from "@angular/core";
import { PreloadAllModules, RouterModule, Routes } from "@angular/router";
const routes: Routes = [
{
path: "",
pathMatch: "full",
redirectTo: "home"
},
{
loadChildren: () => import("./home/home.module").then((m) => m.HomePageModule),
path: "home"
},
{
loadChildren: () => import("./list/list.module").then((m) => m.ListPageModule),
path: "list"
},
{
loadChildren: () =>
import("./myFirstModule/app/myFirstModule.module").then((m) => m.MyFirstModule),
path: "myFirstModule"
},
{
loadChildren: () =>
import("./mySecondModule/app/mySecondModule.module").then((m) => m.mySecondModule),
path: "mySecondModule"
}
];
@NgModule({
exports: [RouterModule],
imports: [RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules })]
})
export class AppRoutingModule {}
Приведенный выше код сработает: ReferenceError: Cannot access 'mySecondModule' before initialization
при нажатии на ссылку в моем меню, НО ошибка не сработает, если я получу доступ к маршруту напрямую по URL!
Если я переверну myFirstModule
и mySecondModule
, например, так:
const routes: Routes = [
{
path: "",
pathMatch: "full",
redirectTo: "home"
},
{
loadChildren: () => import("./home/home.module").then((m) => m.HomePageModule),
path: "home"
},
{
loadChildren: () => import("./list/list.module").then((m) => m.ListPageModule),
path: "list"
},
{
loadChildren: () =>
import("./mySecondModule/app/mySecondModule.module").then((m) => m.mySecondModule),
path: "mySecondModule"
},
{
loadChildren: () =>
import("./myFirstModule/app/myFirstModule.module").then((m) => m.MyFirstModule),
path: "myFirstModule"
}
];
Ошибка сработает при переходе к myFirstModule
: ReferenceError: Cannot access 'myFirstModule' before initialization
но это будет работать, если я получу доступ напрямую через URL ....
Если я удаляю PreloadAllModules, я могу в первый раз перейти к любому модулю, но затем, когда я получаю доступ к другому модулю, я получаю ошибка моих библиотек: ERROR Error: Uncaught (in promise): TypeError: Cannot read property 'prototype' of undefined
TypeError: Cannot read property 'prototype' of undefined at sax.js:222
myFirstModule
export function createTranslateLoader(http: HttpClient): TranslateHttpLoader {
return new TranslateHttpLoader(http, "./assets/i18n/", ".json");
}
@NgModule({
declarations: [
MyFirstModuleComponent,
...
],
entryComponents: [
...
],
exports: [],
imports: [
CommonModule,
IonicModule,
MyMaterialModule,
MyStore1Module,
RouterModule.forChild([
{
component: MyFirstModuleComponent,
path: ""
}
]),
TranslateModule.forChild({
loader: {
deps: [HttpClient],
provide: TranslateLoader,
useFactory: createTranslateLoader
}
})
],
providers: [MyService]
})
export class MyFirstModule{}
MySecondModule
registerLocaleData(_default, "fr");
@NgModule({
declarations: [
MySecondModuleComponent,
...
],
entryComponents: [
...
],
imports: [
CommonModule,
MyMaterialModule,
MatDialogModule,
ClickOutsideModule,
MyStore2Module,
MyStore3Module,
AngularSplitModule.forChild(),
HighchartsChartModule,
RouterModule.forChild([
{
component: MySecondModuleComponent,
path: ""
}
])
],
providers: [
{
provide: LOCALE_ID,
useValue: "fr-FR"
}
]
})
export class MySecondModule{}