如何序列化angular2组件的初始化?
How to serialize initialization of angular2 components?
目前,当引导应用程序组件时,angular2 不会等待所有生命周期阶段的完成。
以下方法开始结束序列将打印到控制台:
AppComponent.ngOnInit() - START
SearchComponent.ngOnInit() - START
AppComponent.ngOnInit() - END
如何等待app组件的所有生命周期阶段完成,顺序如下:
AppComponent.ngOnInit() - START
AppComponent.ngOnInit() - END
SearchComponent.ngOnInit() - START
您无法控制生命周期回调。
您可以使用
*ngIf
在条件更改为 true
之前不显示应用程序的某些部分。如果用这样的 *ngIf="isLoaded"
包装根组件模板的内容,则不会创建除根组件之外的任何组件。
Route guards 以阻止路由导航,直到条件变为 true
。
APP_INITIALIZER
会阻止 Angular2 应用程序的初始化,直到返回的 Promise
解析。示例见
Observables 用于通知状态更改并缓存响应以防止多次调用。有关示例,请参阅 。
我的问题选择的方法是使用 APP_INITIALIZER。无法使用使用路由器的服务(例如 Angulartics2),因为此时路由器尚未初始化。
下面是使用异步等待的示例代码。
@NgModule({
imports: [
HttpModule,
routing,
SharedModule.forRoot()
],
providers: [
{provide: APP_BASE_HREF, useValue: '/'},
{provide: APP_INITIALIZER,
useFactory: (appModule:AppModule) => async () => {
await appModule.init();
}, deps: [AppModule], multi:true}
],
declarations: [AppComponent],
bootstrap: [AppComponent]
})
export class AppModule {
constructor(private service:Service) {
}
// tslint:disable-next-line:typedef
async init() {
await this.service.init();
}
}
目前,当引导应用程序组件时,angular2 不会等待所有生命周期阶段的完成。
以下方法开始结束序列将打印到控制台:
AppComponent.ngOnInit() - START
SearchComponent.ngOnInit() - START
AppComponent.ngOnInit() - END
如何等待app组件的所有生命周期阶段完成,顺序如下:
AppComponent.ngOnInit() - START
AppComponent.ngOnInit() - END
SearchComponent.ngOnInit() - START
您无法控制生命周期回调。
您可以使用
*ngIf
在条件更改为true
之前不显示应用程序的某些部分。如果用这样的*ngIf="isLoaded"
包装根组件模板的内容,则不会创建除根组件之外的任何组件。Route guards 以阻止路由导航,直到条件变为
true
。APP_INITIALIZER
会阻止 Angular2 应用程序的初始化,直到返回的Promise
解析。示例见Observables 用于通知状态更改并缓存响应以防止多次调用。有关示例,请参阅 。
我的问题选择的方法是使用 APP_INITIALIZER。无法使用使用路由器的服务(例如 Angulartics2),因为此时路由器尚未初始化。 下面是使用异步等待的示例代码。
@NgModule({
imports: [
HttpModule,
routing,
SharedModule.forRoot()
],
providers: [
{provide: APP_BASE_HREF, useValue: '/'},
{provide: APP_INITIALIZER,
useFactory: (appModule:AppModule) => async () => {
await appModule.init();
}, deps: [AppModule], multi:true}
],
declarations: [AppComponent],
bootstrap: [AppComponent]
})
export class AppModule {
constructor(private service:Service) {
}
// tslint:disable-next-line:typedef
async init() {
await this.service.init();
}
}