Использование ViewContainerRef
класса с ComponentFactoryResolver
может быть хорошим решением для того, чего вы намерены достичь.На мой взгляд, это более элегантное решение, чем ng-switch
для того, чего вы хотите достичь.
По сути, вы бы поступили следующим образом:
LoginModule
@NgModule({
declarations: [
// all your components
],
entryComponents: [
// components to be loaded at each step
],
imports: [
CommonModule,
]
})export class LoginModule { }
Директива : вы создаете директиву для ng-шаблона, которая будет содержать компоненты, которые необходимо изменить на каждом этапе входа в систему
@Directive({
selector: '[appAppsHost]'
})
export class AppsHostDirective {
constructor(public viewContainerRef: ViewContainerRef) { }
}
LoginService : эта служба должна содержать список всех компонентов, которые вы хотите визуализировать внутри viewContainerRef, в основном она содержит метод, который возвращает соответствующий компонент:
getAppComponentItem(componentIdentifier: string): AppComponentItem {
return this.appComponentItems[componentIdentifier];
}
ContainerComponent : затемпоследняя часть, где вы создаете контейнерный компонент, который должен содержать требуемый компонент:
@Component({
selector: 'login-container',
templateUrl: './login-container.component.html',
styleUrls: ['./login-container.component.scss']
})
export class LoginContainerComponent implements OnInit {
@ViewChild(AppsHostDirective) appAppsHost: AppsHostDirective;
constructor(
private readonly componentFactoryResolver: ComponentFactoryResolver,
private readonly loginComponentService: LoginComponentService) {}
ngOnInit() {
const viewContainerRef = this.appAppsHost.viewContainerRef;
const appComponentItem = this.loginComponentService.getAppComponentItem('identifier');
const componentFactory = this.componentFactoryResolver.resolveComponentFactory(appComponentItem.component);
viewContainerRef.clear();
}
}
Для получения дополнительной информации вы можете прочитать документы Angular: https://angular.io/guide/dynamic-component-loader