如何动态地将组件作为子组件添加到指令中?

2023-12-22

我一直在尝试 Angular 2,并且我已经能够通过获取现有子组件的 @ViewChild 然后使用 ComponentResolver 添加我的动态组件来动态地将一个组件添加到另一个组件的子组件中。

但是,如果您无法控制模板(即您动态地将组件添加到指令的子项),您应该怎么做?我不知道我的指令的容器中会包含哪些元素,那么我如何获得类似的 ViewContainerRef 呢?

EDIT:我似乎在获取指令的 @ViewChild 时也遇到问题。Here's http://plnkr.co/edit/Y9dKWI8MJgnZENUWxHuX?p=preview我的应用程序中发生的事情的一个笨蛋..

你好.组件.ts

import { Component } from '@angular/core'

@Component({
  selector: 'hello',
  template: '<h1>Hi!</h1>',
  styles: ['h1{background-color: green}']
})
export class HelloComponent {}

测试指令.ts

import { Directive, ViewChild, ViewContainerRef, ComponentResolver, OnInit } from '@angular/core';
import { HelloComponent } from './hello.component'

@Directive({
  selector: '[testDir]'
})
export class TestDirective implements OnInit {
  @ViewChild('div', {read: ViewContainerRef}) div;

  constructor(private viewContainerRef: ViewContainerRef, private componentResolver: ComponentResolver) {}

  ngOnInit() {
    this.componentResolver.resolveComponent(HelloComponent).then((factory) => {
      this.div.createComponent(factory);
      this.viewContainerRef.createComponent(factory);
    });
  }
}

应用程序组件.ts

import { Component } from '@angular/core';
import { TestDirective } from './app.directive';
import { HelloComponent } from './hello.component'

@Component({
  selector: 'my-app',
  template: `
    <div testDir>
      <div #div></div>
    </div>
  `,
  directives: [TestDirective, HelloComponent]
})
export class AppComponent { 
}

您可以使用以下命令将组件添加到指令的子项中Renderer2服务。

此示例使用新创建的组件的元素引用,并通过使用渲染服务将其附加到当前元素引用。

下面是一个在单击它时执行此操作的指令,您也可以在 Init 上执行相同的操作:

@Directive({
  selector: '[mydirective]'
})
export class MyDirective {
  constructor(
    private cfResolver: ComponentFactoryResolver,
    public vcRef: ViewContainerRef,
    public elementRef: ElementRef,
    private renderer: Renderer2
  ) { }


  @HostListener('click', ['$event'])
  onClick() {
    const factory =
      this.cfResolver.resolveComponentFactory(HelloComponent);
    const componentRef = this.vcRef.createComponent(factory);
    this.renderer.appendChild(
      this.vcRef.element.nativeElement,
      componentRef.injector.get(HelloComponent).elementRef.nativeElement
    );
  }
}

您还可以设置任意Input将动态组件附加到当前宿主元素之前的属性。

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

如何动态地将组件作为子组件添加到指令中? 的相关文章

随机推荐

  • LINQ-NHibernate - 为复杂对象仅选择几个字段(包括集合)

    我在我的一个项目 和 ASP NET MVC 应用程序 中使用 Fluent NHibernate 并使用 LINQ 来查询数据 使用 LINQ to NHibernate 库 更改物体名称是为了保护无辜者 假设我在数据库 MySQL 中有
  • 如何在JAVA中使用apache poi删除Excel中的警告?

    我在用apache poi api在我的 java 应用程序中生成 Excel 工作表 Excel 中设置的数据以字符串类型动态获取 对于第 1 列 值是字母数字 当我生成 Excel 时 它会给我绿色指示并带有警告 数字存储为文本 or
  • 对称 Lerp 和编译器优化

    我有一个功能 float lerp float alpha float x0 float x1 return 1 0f alpha x0 alpha x1 对于那些还没有看过的人来说 这比x0 x1 x0 alpha因为后者并不能保证ler
  • SonarQube 5.6 恢复质量配置文件

    我正在尝试使用curl 通过 Web API 恢复全新安装的 SonarQube v 5 6 4 的质量配置文件 在 c temp 中 我有一个从运行 Sonar 导出的 Sonar way 配置文件 我已将其重命名为 test xml 在
  • 使用 php usort 进行第二次排序

    所以我有相当大的数据数组 需要按两个标准对它们进行排序 有变数 data important and data basic 它们是简单的数字 我使用 uasort 进行排序 data首先按重要 然后按基本 So Important Basi
  • 如何在powershell中分析(计时)

    我的 powershell 脚本运行缓慢 有什么方法可以分析 powershell 脚本吗 在此处发布您的脚本确实有助于给出准确的答案 您可以使用 Measure Command 查看脚本中每个语句所花费的时间 但是 您必须将每个语句包装在
  • 基于在线 Apache Web 日志分析器,仅提交原始日志文件 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个来自 Apache 的原始 access log 文件 是否有任何基于网络的版本工具 我可以在其
  • XSLT:如何生成每行 3 个单元格的 HTML 表格

    我按照以下说明生成了一个每行 2 个单元格的 HTML 表格这篇文章来自 StackOverflow https stackoverflow com questions 5387134 xslt and tables setting num
  • 如何使用 F# 语法将 Type 作为属性参数传递?

    FsCheck 允许自定义Arbitrary在其 NUnit 集成中
  • Ruby 中的自然语言处理 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想做一些句子分析 主要针对 Twitter 应用程序 并推断一些一般特征 Ruby 中有针对此类事情
  • 如何在 Perl 中使用 fork() ?

    我的数组中有数百个文件名 我想为数组中的每 4 个文件创建一个子进程 并让该子进程对这 4 个文件中的每一个文件执行一些操作 因此 对于 100 个文件 我将创建 25 个进程 我在理解存在分叉时处理行的顺序时遇到一些困难 我本以为我可以做
  • Audiomanager 和 MediaPlayer 之间的区别

    谁能解释一下有什么区别AudioManager and MediaPlayer在安卓中 如果我是对的 那么AudioManager只能播放音频 而MediaPlayer可以播放音频和视频 但我相信这其中一定还有更多的内容 Thanks Au
  • 如何在 Python 中进行 Obj-C 类别?

    Obj C 我已经很长时间没有使用它了 有一个叫做类别 http macdevelopertips com objective c objective c categories html来延长课程 用新方法声明一个类别并将其编译到您的程序中
  • 如何在 Objective c 中获取当前月份的日期?

    我正在开发一个使用日期 月份 年份的应用程序 我想要当前月份的日期 因为当前月份可以有 28 29 30 31 天 我试图获取当年的月份 但我不知道上面的代码 这是我的代码 NSDateFormatter dateFormatter NSD
  • 使用 ApplicationDbContext 的身份脚手架

    ASP NET Core 2 x 现在将身份页面和逻辑隐藏在库内 为了延长IdentityUser具有新属性的实体并添加 UI 和逻辑来处理这些新属性 我们现在可以运行 身份脚手架 在 MyProject gt 添加 gt 新脚手架项下 很
  • 动态启用/禁用 jquery 可排序项目

    我的表格行可以根据是否选中某些单选按钮进行排序 可排序对象初始化于document ready如下 document ready function Return a helper with preserved width of cells
  • django 中是否有像 Rails 中那样的 before_filter ?

    django中有没有可用的功能 以便我们可以在django视图中对所有操作进行一些过滤 例如rails中可用的 before filter 我仍在学习 Rails 但从我到目前为止观察到的来看 python装饰者 http en wikip
  • GameCenter:endTurnWithNextParticipants 未前进

    在沙盒环境中 我无法将回合制比赛推进到下一个玩家 初始条件 玩家 A 和玩家 B 分别位于设备 A 和设备 B 上 两者都登录到沙箱 双方玩家都可以看到对方的GC状态信息 玩家 A 创建一场比赛并邀请玩家 B 玩家A结束回合 在我的 结束转
  • Tensorflow 错误:FailedPeconditionError:尝试使用未初始化的变量

    我想将立体图像放入优化器中 这是我的代码 tf reset default graph config learning rate 0 5 training epochs 5 init init tf global variables ini
  • 如何动态地将组件作为子组件添加到指令中?

    我一直在尝试 Angular 2 并且我已经能够通过获取现有子组件的 ViewChild 然后使用 ComponentResolver 添加我的动态组件来动态地将一个组件添加到另一个组件的子组件中 但是 如果您无法控制模板 即您动态地将组件