遅延読み込みが実装されているAngularアプリケーションに取り組んでいます。遅延読み込みを試してみましたが、まだアプリケーションに実装したくないと判断しました。これは私のapp.module.ts
です。
app.module.ts:
@NgModule({
declarations: [
AppComponent,
],
imports: [
BrowserModule,
RouterModule.forRoot([
{ path: '', redirectTo: 'store', pathMatch: 'full'},
{ path: 'hq', loadChildren: 'app/hq/hq.module#HqModule' },
{ path: 'store', loadChildren: 'app/store/store.module#StoreModule', pathMatch: 'prefix'},
]),
],
bootstrap: [AppComponent],
exports: [RouterModule],
})
export class AppModule { }
ルートをたとえばhq
に切り替えて通常の読み込みに戻すにはどうすればよいですか?私は次のようなことがうまくいくと思っていました:
{ path: 'hq', redirectTo: HqModule }
しかし、それは私のモジュールが間違ったタイプの引数であることを返します。これはAngularでも可能ですか?
hq.module.ts
@NgModule({
imports: [
CommonModule,
RouterModule.forChild([
{ path: '',
component: HqTemplateComponent,
canActivate: [AuthGuard],
children: [
{ path: '', pathMatch: 'full', redirectTo: 'overview' },
{ path: 'overview', component: OverviewComponent, canActivate: [AuthGuard] },
]
},
]),
],
declarations: [HqTemplateComponent, OverviewComponent]
})
文字列を次のような矢印関数に変更するのが好きです。
import { HqModule } from './hq/hq.module';
{ path: 'hq', loadChildren: () => HqModule },
foraot angular 4以下:
export function loadHqModuleFn() {
return HqModule;
}
{ path: 'hq', loadChildren: loadHqModuleFn },
注:バージョン5以降、コンパイラーは.jsファイルの発行中にこの書き換えを自動的に実行します。 「式を下げる」のおかげで
angular-router-loader を使用する場合、このロードには モジュールを同期的にロードする の特別な構文があることに注意してください。クエリ文字列値としてsync=true
をloadChildren string
に追加するだけです。
{ path: 'hq', loadChildren: 'app/hq/hq.module#HqModule?sync=true' },
もちろん、モジュールをimports
アレイに追加することもできますが、この場合、このモジュールのルーター構成パスを変更する必要があります。
app.module.ts
@NgModule({
imports: [
...,
HqModule,
BrowserModule,
RouterModule.forRoot([
{ path: '', redirectTo: 'store', pathMatch: 'full'},
{ path: 'store', loadChildren: 'app/store/store.module#StoreModule', pathMatch: 'prefix'},
])
]
...
})
export class AppModule {}
hq.module.ts
@NgModule({
imports: [
...
RouterModule.forChild([
{ path: 'hq', <========================== changed '' to `hq`
component: HqTemplateComponent,
canActivate: [AuthGuard],
children: [
...
]
},
]),
],
...
})
angularルーターの設定は順序が厳密です。 ドキュメント :によると、言及する価値があります。
ルータはルートを照合するときに最初の一致の勝ち戦略を使用するため、より具体的なルートをあまり具体的でないルートの上に配置する必要があります
したがって、ルート定義を含むモジュールを、RouterModule.forRoot
で行うのと同じ順序でimports
配列に追加します。
AppModuleのインポート配列にHqModule
を追加し、AppModuleルーティング定義からHqModuleエントリを削除します。このような:
@NgModule({
declarations: [
AppComponent,
],
imports: [
BrowserModule,
HqModule, // add it
RouterModule.forRoot([
{ path: '', redirectTo: 'store', pathMatch: 'full'},
{ path: 'store', loadChildren: 'app/store/store.module#StoreModule', pathMatch: 'prefix'}
])
],
bootstrap: [AppComponent],
exports: [RouterModule],
})
export class AppModule { }