跳至正文
首页 » 博客 » How to dynamically create a Component in Angular

How to dynamically create a Component in Angular

在本文中,我们将学习动态创建组件。您可能需要在各种场景中动态加载组件,例如想要显示弹出模式等。

让我们假设,我们有一个组件如下所示,我们将动态加载。

 “@ angular/core” 导入 { Component,Input}; @ Component({'app-message' 选择器,模板: '<h2 >{{ message }}</h2>' })导出MessageComponent {@ Input() message: string;} 

要动态加载MessageComponent,您需要一个容器。假设我们要在AppComponent中加载MessageComponent。我们在AppComponent中需要一个容器元素。

AppComponent的模板如下:

< div style = "text-align: center" >< h1 >欢迎来到 {title }}</ h1 >< 模板 # messagecontainer ></ 模板 ></ div > 

如您所见,我们有一个入口点模板或容器模板,我们将在其中动态加载MessageComponent。

在AppComponent中,我们需要导入以下内容:

  1. ViewChild、ViewContainerRef和ComponentFactoryResolver来自 @ angular/core
  2. ComponentRef和ComponentFactory来自 @ angular/core
  3. MessageComponent来自m message.com组件

导入所需的东西后,AppComponnet将如下所示:

导入 {组件,ViewChild,ViewContainerRef,ComponentFactoryResolver,组件,ComponentFactory“@ angular/core' 中的 }; “./message.com组件” 导入 { MessageComponent}; @ Component({'app-root' 选择器,templateUrl: './app.component.html'})AppComponent导出 {title = 'app';} 

我们可以访问模板作为组件类中的ViewChild。模板是一个容器,我们希望在其中动态加载组件。因此,我们必须以ViewConatinerRef的身份访问temple。

ViewContainerRef表示可以附加一个或多个视图的容器。这可以包含两种类型的视图。

  1. 主机视图
  2. 嵌入式视图

主机视图是通过使用createComponent实例化组件来创建的,嵌入式视图是通过使用createEmbeddedView实例化嵌入式模板来创建的。我们将使用主机视图来动态加载MessageComponent。

让我们创建一个名为entry的变量,它将引用模板元素。此外,我们已将ComponentFactoryResolver服务注入到component类中,这些服务将需要动态加载组件。

AppComponent导出 {title = 'app';@ ViewChild( 'messagecontainer' ,{read: ViewContainerRef }) 条目: ViewContainerRef;构造函数 (私有解析器: ComponentFactoryResolver) { }} 

请记住,作为模板元素引用的输入变量具有用于创建组件,销毁组件等的API。

现在要创建组件,让我们创建一个函数。在函数内部,我们需要执行以下任务,

  • 清除容器
  • 为MessageComponent创建工厂
  • 创建组件使用工厂
  • 传递 @ Input属性的值使用组件引用实例方法

将所有内容放在一起,createComponent函数将如下所示:

createComponent (消息) {这个 .entry.clear();const工厂 = 这个。resolver.resolveComponentFactory(MessageComponent);const componentRef = 这个。entry.createComponent (工厂);componentRef.instance.message = 消息;} 

我们可以在按钮的click事件上调用createComponent函数。让我们在模板中放置两个按钮,并在单击按钮时调用createComponent函数。

< div style = "text-align: center" >< h1 >欢迎来到 {title }}</ h1 >< 按钮 (单击) = "createComponent('Welcome Foo ! ')" 欢迎 > </ 按钮 >< 按钮 (单击) = "createComponent('Foo Again?')" 不受欢迎 < </ 按钮 >< br />< 模板 # messagecontainer ></ 模板 ></ div > 

在输出中,您可以看到组件在单击按钮时动态加载。

当你点击按钮组件将重新加载不同的消息。可以使用componentRef上的destroy方法销毁组件。

destroyComponent() {这个 .componentRef.de stroy();} 

您可以通过手动调用函数来销毁动态加载的组件,或者将其放入组件的ngOnDestroy() 生命周期钩子中,这样当主机组件被自动销毁时,动态加载的组件也会销毁。

将所有内容放在一起, AppComponent将如下所示:

导入 {组件,ViewChild,ViewContainerRef,ComponentFactoryResolver,组件,ComponentFactory“@ angular/core' 中的 }; “./message.com组件” 导入 { MessageComponent}; @ Component({'app-root' 选择器,templateUrl: './app.component.html'})AppComponent导出 {title = 'app';componentRef: 任何; @ ViewChild( 'messagecontainer' ,{read: ViewContainerRef }) 条目: ViewContainerRef;构造函数 (私有解析器: ComponentFactoryResolver) { } createComponent (消息) {这个 .entry.clear();const工厂 = 这个。resolver.resolveComponentFactory(MessageComponent);这个 .componentRef = 。entry.createComponent (工厂);这个 .componentRef.instance.message = 消息;}destroyComponent() {这个 .componentRef.de stroy();}} 

此时,在运行应用程序时,您将收到一个错误,因为我们尚未在AppModule中设置entryComponents。我们可以设置如下所示:

 “./app.com组件” 导入 { AppComponent}; “./message.com组件” 导入 { MessageComponent}; @ NgModule({声明: [AppComponent, MessageComponent],进口: [浏览器模块],供应商: [],bootstrap: [AppComponent],entryComponents: [MessageComponent]})导出AppModule { } 

这就是在Angular中动态加载组件所需要做的。

喜欢这篇文章吗?

你有它!如果你喜欢这篇文章,请喜欢它并分享它。此外,如果你还没有退房为Angular点燃UI,一定要这样做!他们有50个基于材质的Angular组件,可以帮助您更快地编写快速的web应用程序。

</p