将字符串转换为 class typescript/angular

Convert string to class typescript/angular

我有一个模态弹出组件。它以字符串作为输入,然后动态加载其他组件。这样我就可以拥有一个模式弹出组件,而不是为我在应用程序中需要的每个模式复制一个模式弹出代码。 问题是这会导致一个很大的 if/else 语句,我在其中根据字符串输入加载适当的组件

if (this.data.component == "ContactStaffComponent")
  componentFactory = this.componentFactoryResolver.resolveComponentFactory(ContactStaffComponent);
else if (this.data.component == "DocketComponent")
  componentFactory = this.componentFactoryResolver.resolveComponentFactory(DocketComponent);
else if (this.data.component == "FilingComponent")
  componentFactory = this.componentFactoryResolver.resolveComponentFactory(FilingComponent);
else if (this.data.component == "ServiceListRecordComponent")
  componentFactory = this.componentFactoryResolver.resolveComponentFactory(ServiceListRecordComponent);
else { }

有没有办法将字符串转换成类型?与 .net 反射类似的东西?

您可以使用您的组件创建一个对象

private modals = {
    ContactStaffComponent: ContactStaffComponent,
    DocketComponent: DocketComponent
};

然后根据输入的字符串就可以得到组件并传递给组件解析器

let component = this.modals[this.data.component];
componentFactory = this.componentFactoryResolver.resolveComponentFactory(component);

通过这个,你可以消除一个大的if/else代码块。希望这对您有所帮助

为了让代码更简洁,可以这样声明一个Observable of Components:

import { of } from 'rxjs';
import { filter } from 'rxjs/operators';

...

export class ... {
  componentList$ = of(
    ContactStaffComponent,
    DocketComponent,
    FilingComponent,
    ServiceListRecordComponent
  );
  ...
}

您可以通过访问 componentList$ 的 .name 属性来获取组件的名称。并按如下方式过滤 componentList$。

this.componentList$.pipe(
  filter(component => this.data.component == component.name.toString()))
  .subscribe((componentName: any) =>{
    componentFactory = this.componentFactoryResolver.resolveComponentFactory(componentName);
  });

希望这对您有所帮助。 CYA!