在 Material MatDialog 中动态加载组件

2023-12-20

谁能提供一个如何将组件动态加载到 Material MatDialog 中的示例?

我想做的是:我将为 MatDialog 配置数据提供一个组件类型,然后对话框将创建一个实例并将其放置在其 mat-dialog-content 区域内。

看来我需要使用 ng-template 和 viewContainerRef 的某种组合,但我不知道如何实例化提供的组件类型并插入到所需的区域。

一个简单的例子:

    <h2 mat-dialog-title>MyTitle</h2>
    <mat-dialog-content>
     <---- dynamically loaded component would be inserted here ---->
    </mat-dialog-content>

    <mat-dialog-actions>
      <button mat-button mat-dialog-close>Cancel</button>
      <button mat-button [mat-dialog-close]="true">Save</button>
    </mat-dialog-actions>

有不同的选择:

1)内置结构指令ngComponentOutlet

<ng-container *ngComponentOutlet="data.component"></ng-container> 

Example https://ng-run.com/edit/uhR7qzifwhr3QH9fNOMv?open=app%2Fapp.component.ts

2)使用角材料cdk。更准确地说,你可以使用PortalModule从辅助入口点@angular/cdk/portal

对话框组件.ts

import { ComponentPortal } from '@angular/cdk/portal';

@Component({...})
export class DialogDialog {

  portal: ComponentPortal<any>;

  constructor(...
    @Inject(MAT_DIALOG_DATA) public data: any) { }

  ngOnInit() {
    this.portal = new ComponentPortal(this.data.component);
  }
      

对话框.组件.html

<ng-template [cdkPortalOutlet]="portal"></ng-template>

Example https://ng-run.com/edit/OP87U87X2gR7U4ZmsxN3?open=app%2Fdialog.component.html

3)使用 Angular 低级 API

对话框组件.ts

@Component({...})
export class DialogDialog {

  @ViewChild('target', { read: ViewContainerRef }) vcRef: ViewContainerRef;

  componentRef: ComponentRef<any>;

  constructor(
    ...
    private resolver: ComponentFactoryResolver,
    @Inject(MAT_DIALOG_DATA) public data: any) { }

  ngOnInit() {
    const factory = this.resolver.resolveComponentFactory(this.data.component);
    this.componentRef = this.vcRef.createComponent(factory);
  }


  ngOnDestroy() {
    if (this.componentRef) {
      this.componentRef.destroy();
    }
  }  
}

对话框.组件.html

<ng-template #target></ng-template>

Example https://ng-run.com/edit/9giHmJ8bzMa8tBcZAm5t?open=app%2Fdialog.component.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Material MatDialog 中动态加载组件 的相关文章

随机推荐

  • 如何将任意数据粘贴到 TMemo 中?

    复制和粘贴文本很容易 因为它内置于 TMemo 中 但它似乎只能处理文本 不过 在我看来 任何类型的数据都可以表示为字符串 如果我从另一个程序复制一些任意数据并希望将其粘贴到 TMemo 中 如何让 Delphi 将其接受为原始字符串 如果
  • 从Android设备读取数据库文件

    我一直在尝试从我的 Android 应用程序中提取 SQLite 数据库的副本以供开发 我的第一次尝试是打电话 adb shell cd data data cd com example app cd databases 但后来我被困在这里
  • jQuery DatePicker 问题:设置当前日期

    日期选择器setDate方法 如上所述here http docs jquery com UI Datepicker method setDate没有按预期工作 日期选择器始终获取浏览器的当前日期 但是我要设置我选择的当前日期 target
  • 快速分割数组的优雅方法

    给定任何类型的数组和所需的子数组数量 我需要以下输出 print 0 1 2 3 4 5 6 splitInSubArrays into 3 0 3 6 1 4 2 5 输出必须包含正确数量的子数组 即使没有 足够 的元素来填充这些子数组
  • 如何找到文本框中光标的位置? C#

    我有一个标准的 WinForms TextBox 我想在文本中的光标位置插入文本 如何获取光标的位置 Thanks 无论是否选择任何文本 选择开始 http msdn microsoft com en us library system w
  • ASP.Net MVC 中通过 ajax 传递列表

    我想通过 AJAX 传递列表 我怎样才能做到这一点并在运行时赋值 我正在这样做 但它传递了空值 这是我的代码 JQuery for var i 0 i lt 5 i aabc id i color Level i var str2 aabc
  • 使用 LINQ 连接两个列表

    我有两个列表 list1 和 list2 列表1包含 1 a 2 b 3 c 4 d 列表2包含 3 c 4 d 5 e 我想要使 用 LINQ 以下列表 1 a 2 b 3 c 4 d 5 e List1 Concat List2 Whe
  • 在命令行上运行的 C++ 代码覆盖工具[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何根据设备屏幕尺寸调整集合视图单元格的大小?

    我注意到单元格总是遵循尺寸检查器中的定义 即使我已经应用了 UICollectionViewDelegateFlowLayout 看起来就是这样 但我希望这些单元格看起来更像更小的 iPhone 屏幕上的样子 实施sizeForItemAt
  • 使用实体框架的最小存储库实现

    我正在尝试在我的应用程序中实现最小的通用存储库模式 我有一个非常小的界面用于查询和保存数据 public interface IRepository IQueryable
  • 反应子/父组件 - onChange 事件只接受一个字符并且不保留值

    在 ReactJS 中 在我的子组件中 输入 gt 文本上的 onChange 事件仅采用一个值 并且不会在每次按键时保留先前的值 我正在尝试捕获子表单中的输入 并希望将其传输给父表单 实际上 我正在尝试重用子表单来创建和编辑页面 我的完整
  • 如何使用 TailwindCSS 禁用环形阴影?

    这就是我的问题的样子 见环 看图 https i stack imgur com RLCE0 png 使用Chrome的inspector发现与 tw ring shadow 所以我尝试添加类ring 0 and ring offset 0
  • 如何在 JavaFX 8 中创建自定义 3D 模型?

    我尝试使用官方教程在 JavaFX 应用程序中制作一架飞机 并有以下代码 Image diifuseMap new Image getClass getResource t jpg toExternalForm TriangleMesh p
  • Django:如何在给定实际值和选择的情况下访问模板中 ChoiceField 的显示值?

    我有一个绑定形式的 ChoiceField 其选择是 all All users group Selected groups none None 在模板中 我可以毫无问题地访问其绑定值 要存储的实际值 每个元组的第一个元素 和选择 有了这些
  • PayPal + RESTful API + WebHooks + 自签名证书

    我一直在使用 PayPal 的 REST API 并且能够毫无问题地处理销售 退款等 但我在网络钩子方面遇到了问题 我在沙箱中配置了一个 webhook 它从不将信息发布到 webhook URL 甚至不尝试根据访问日志 由于 wbehoo
  • webapp 和 web.py 之间的区别

    Webpy org 谁使用 web py http webpy org web py 启发了 Web 框架 我们在 FriendFeed 和 网络应用程序中使用 App 附带的框架 引擎 布雷特 泰勒 FriendFeed 联合创始人和原创
  • 如何从远程 php 脚本响应获取二进制文件?

    我正在调用一个脚本 该脚本为我提供了一个带有二进制数据的二进制文件 12345 cl 脚本已完成 并且正在运行 如果我将其粘贴到导航器上 我会得到二进制文件 现在我有一个问题 如何将脚本的响应转换为二进制资源以在我的应用程序中使用它 目前
  • 在 LaTeX Beamer 中调整矩阵大小

    您好 我想知道如何在投影仪环境中调整矩阵大小 目前我正在编写以下代码 begin align left begin array ccccccc 0 1 1 0 0 1 1 0 ddots 0 1 1 0 end array right
  • 较新版本的 JRE 不会加载音库,但较旧版本会加载

    我有以下代码尝试加载音库 我已经使用 JRE 1 6 03 和 1 6 43 在 Windows 7 上测试了代码 旧版本的 JRE 1 6 03 工作正常 但新版本会引发异常 这是怎么回事 public Main try Synthesi
  • 在 Material MatDialog 中动态加载组件

    谁能提供一个如何将组件动态加载到 Material MatDialog 中的示例 我想做的是 我将为 MatDialog 配置数据提供一个组件类型 然后对话框将创建一个实例并将其放置在其 mat dialog content 区域内 看来我