在 ngIf 内动态添加组件

2024-01-07

我有一些代码可以动态地向我的页面之一添加/删除组件。这似乎工作得很好,我的方法基于 Rob Wormald 的很棒的方法NG2 高级讲座 https://www.youtube.com/watch?v=ZqGvilzDbac.

以标准方式做事看起来像这样:

@Component({
    template: `
    <parent-component>
       <template #dyn_target></template>
    </parent-component>
    `
 })
 export class MyComp {
     @ViewChild('dyn_target', {read: ViewContainerRef}) myTarget;

     constructor(protected cfr: ComponentFactoryResolver) {}

     ngOnInit(): void {
        const factory = this.cfr.resolveComponentFactory(DynComp);
        const compRef = this.myTarget.createComponent(factory);
     }
 }

一切都很愉快并且顺利。但现在我的问题是,如果组件的目标位置是一个本身位于 *ngIf 内部的元素,我该如何做这样的事情?我有代码知道 *ngIf 何时应显示新元素,但我不知道如何在 *ngIf 内部查找 ViewContainerRef 目标。

@Component({
    template: `
    <parent-component>
       <other-comp></other-comp>
       <div *ngIf="showMe"
           <nested-comp>
              <template #dyn_target></template>
           </nested-comp>
       </div>

    </parent-component>
    `
 })
 export class MyComp {
     @ViewChild('dyn_target', {read: ViewContainerRef}) myTarget;
     showMe: boolean = false;

     constructor(protected cfr: ComponentFactoryResolver) {}

     addDynComponent(): void {
        // Q: how do I do this?           vv
        const target: ViewContainerRef = lookup('dyn_target');
        const factory = this.cfr.resolveComponentFactory(DynComp);
        const compRef = target.createComponent(factory);
     }
 }

我考虑过尝试删除 ngIf 并使整个块动态化,但这并不适合我的情况,因为大多数内容是静态的,当/如果 ngIf 为 true 时,只需要添加一个子组件。

有人知道在 ngIf 将其他元素添加到 DOM 后如何动态查找 ViewContainerRef 吗?

注意:我想到的另一种方法是添加一个新的组件类型,该类型仅显示基于组件类类型的输入的嵌套组件。我见过为 Ionic 2 所做的此类事情,它可能对我的情况有效,但似乎有点矫枉过正。所以像这样:

@Component({
    template: `
    <parent-component>
       <other-comp></other-comp>
       <div *ngIf="showMe"
           <nested-comp>
              <show-comp [compClass]="dynClass"></show-comp>
           </nested-comp>
       </div>

    </parent-component>
    `
 })
 export class MyComp {
     dynClass: any;
     showMe: boolean = false;

     addDynComponent(): void {
        dynClass = DynComp;
     }
 }

我认为这应该有效

@ViewChildren('dyn_target', {read: ViewContainerRef}) myTarget:QueryList<ViewContainerRef>;

ngAfterViewInit() {
  this.myTarget.changes.subscribe(changes => {
    if(this.myTarget.toArray().length) {
      // myTarget ViewContainerRef available
    }
  });
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 ngIf 内动态添加组件 的相关文章

随机推荐

  • 使用android gradle + dagger运行instrumentTests

    我最近开始使用 Android Studio 和 gradle 进行 android 开发 发现它总体上比 eclipse ant 或 maven 好得多 不过 我最近开始尝试使用我的应用程序实施某种单元和 或集成测试 我能够使用谷歌最近发
  • 如何在centOS 7中启动apache

    我使用以下命令启动 Apache service httpd start in centOS6 今天我下载了centOS7 64bit minimal并想在安装后启动 Apache 当我使用service httpd start 操作系统会
  • 我应该如何在后台运行我的 Golang 进程?

    这个问题与编程无关 但对于程序员来说肯定很重要 我编写了一个简单的 smtp 服务器 当我从控制台运行它时 一切都很好 除了它阻止了命令行 我知道我可以通过以下方式运行它 nohup 或通过 screen tmux 等 但问题是 我应该如何
  • 带魔杖的谷歌云功能停止工作

    我设置了 3 个 Google Cloud Storge 存储桶和 3 个函数 每个存储桶一个 当 PDF 文件上传到存储桶时将触发这些函数 函数将 PDF 转换为 png 图像并进行进一步处理 当我尝试创建第四个存储桶和类似的功能时 奇怪
  • Keras:“运行时错误:无法导入 pydot。”安装 graphviz 和 pydot 后

    我在 Windows 10 上使用 Anaconda Python 2 7 我计划进行 Keras 可视化 因此 当间谍程序打开时 我打开了 Anaconda 命令提示符并 pip 安装了 graphviz 和 pydot 现在 当我尝试运
  • 区分扫描仪和键盘

    大家好 我有一台条形码扫描仪连接到一台使用 c 程序的 PC 现在我想区分扫描仪和键盘 哪一个正在向我的程序发送数据 每个人都可以帮助我编写 c 代码或提供建议吗 有人在另一个主题中对我说了这句话 但我还不能这样做 基本上 您可以配置扫描仪
  • Glassfish 服务器不支持 JDK 8

    我在 NetBeans 的 Web 项目中使用带有 lambda 的 jdk 8 但是当将其部署到 glassfish 时 它向我显示以下错误 java lang RuntimeException Uncompilable source c
  • 当字符串文字改变时会发生什么? [复制]

    这个问题在这里已经有答案了 我想将字符串文字更改为全大写 这是我的代码 a and b are the same literal String a Test String b Test now I want to change all b
  • 创建自定义 UIView 并在 Swift 中显示为弹出窗口

    我正在尝试创建一个自定义UIView并使用 Swift 在我的主视图中将其显示为弹出窗口 我的定制UIView代码是 class DatePopUpView UIView var uiView UIView override init su
  • 带有 LLVM 的 C ABI

    我有一个用 LLVM 编写的编译器 我希望提高 ABI 合规性 例如 我发现很难在 Windows x86 或 Linux 上实际找到 C ABI 的规范文档 我发现的那些用 RAX EAX 等术语解释它 而不是我可以使用的 IR 术语 到
  • 如何:动态移动 Google Gauge?

    观察 CPU 和内存指标 http code google com apis visualization documentation gallery gauge html Loading一会儿 它们动态地移动 下面显示的示例代码不会像那样移
  • 来自 nginx/passenger 的“从应用程序收到的响应不完整”

    我尝试通过 capistrano 在 nginx 和 ubuntu 上部署我的 Rails 应用程序 就像页面上的教程一样https gorails com deploy ubuntu 14 04 https gorails com dep
  • Java 8 替代 Map.entry() 将值映射到新 Map?

    我找到了解决长期以来一直试图解决的问题的解决方案 不幸的是 我无法使用该解决方案 因为目标 java 版本是 Java 8 Map
  • 如何在大型 SQL Server 查询中使用多个核心?

    我有两台 SQL Server 一台用于生产 一台用作存档 每天晚上 我们都会运行一个 SQL 作业并将当天的生产数据复制到存档中 随着我们的成长 这个过程需要的时间越来越长 当我观察运行归档进程的归档服务器上的利用率时 我发现它只使用单个
  • C# 中的 Jaro–Winkler 距离算法

    如何在 C 中实现 Jaro Winkler 距离字符串比较算法 public static class JaroWinklerDistance The Winkler modification will not be applied un
  • 使用 log4j 编写审核日志

    我有一个应用程序需要写入两种不同类型的日志 应用程序日志和审核日志 应用程序日志用于调试目的 而审核日志用于记录所执行的操作 两个日志将位于不同的文件中 每个文件应仅包含上述日志 意味着审核日志文件不能包含应用程序日志 反之亦然 如何使用
  • 在 Node.js 中缓存数据最便宜的方法?

    我正在实现一个运行匹配算法的 Node js 服务器 由于我希望服务器尽快响应 因此我希望能够从缓存中检索数据 而不是每次都查询数据库 例如 我需要保留 10000 50000 个用户的信息 我担心这会占用大量内存 有没有什么方法可以将这么
  • Nodemailor 无法跨域发送电子邮件

    我正在使用 NodeMailor 通过 Node 和 Express 应用程序发送电子邮件 问题 当我跨域发送电子邮件时 例如 我正在使用 Hostgator 电子邮件服务器 它仅使用 Hostgator 在托管电子邮件上发送电子邮件 但当
  • 如何使用 htaccess 强制使用 http- 而不是 https

    我的整个域有一个目录 我想强制使用 https 即 docs 在 docs 文件夹中 我有以下 htaccess 文件 RewriteEngine On RewriteCond HTTPS on RewriteRule https HTTP
  • 在 ngIf 内动态添加组件

    我有一些代码可以动态地向我的页面之一添加 删除组件 这似乎工作得很好 我的方法基于 Rob Wormald 的很棒的方法NG2 高级讲座 https www youtube com watch v ZqGvilzDbac 以标准方式做事看起