在 Angular 中有没有办法将包含组件指令的 html 注入到父组件的模板中?

Posted

技术标签:

【中文标题】在 Angular 中有没有办法将包含组件指令的 html 注入到父组件的模板中?【英文标题】:In Angular is there a way to inject html that contains a component directive into the template of a parent component? 【发布时间】:2020-08-16 06:36:24 【问题描述】:

我想在我的数据库中包含组件指令的 html,然后将其用作 Angular 中组件模板的一部分。

例如,如果我有:

<div [innerHTML]="injectMe"></div>

在应用组件模板和应用组件代码中:

export class AppComponent  
  injectMe = "<p>Paragraph</p> <app-injected></app-injected> ";

然后创建一个名为注入的组件:

模板:

<p> injected works! </p>

代码:

@Component(
  selector: 'app-injected',
  templateUrl: './injected.component.html',
  styleUrls: ['./injected.component.css']
)
export class InjectedComponent implements OnInit 

  constructor()  

  ngOnInit() 
  


我在控制台中收到“清理 HTML 删除了一些内容”的警告。在该链之后,我尝试添加一个调用以将字符串标记为安全使用:this.sanitizer.bypassSecurityTrustHtml

export class AppComponent  
  injectHtml = "<p>Paragraph</p> <app-injected></app-injected> ";
  injectMe: any;

  constructor(private sanitizer: DomSanitizer)
    this.injectMe = this.sanitizer.bypassSecurityTrustHtml(this.injectHtml);
  

这导致指令标签留在 HTML 中,没有控制台警告关于清理删除任何内容,但组件似乎没有被 Angular 处理。我看到您可以使用组件工厂来动态创建组件,但是,我认为这对我的情况没有帮助,除非我想手动解析 HTML 以检查组件。

【问题讨论】:

我不认为这是可以做到的。在 Angular 中,必须先编译 html,然后才能在应用程序上使用它。在这种情况下,html 将具有 &lt;app-injected&gt; 标签,但 Angular 不会处理它。您应该采用不同的方法,例如组件工厂 @alexortizl 感谢您的回复。我担心没有办法做到这一点。我以为我最初看到它工作过一次,然后我开始收到消毒警告。所以我必须自己手动解析 HTML,创建组件并插入它们?我想知道如何在组件的 HTML 中保留位置。再次感谢 回到 angularjs 中,我们有 compile 函数使这成为可能,但是 angular 的情况并非如此。也许有一天:) 【参考方案1】:

我不相信这是可能的。

有一个有趣的SO post here 谈到在 Angular 生命周期中何时调用 constructor

有趣的部分:

Angular 开始引导应用程序……它首先为每个组件创建类。所以它调用了 MyAppComponent 的构造函数。

即Angular 解析 html 中的 html 以找出它需要实例化的 typescript 组件。这意味着您不能注入 html 并期望 Angular 将其包含在引导过程中,因为它已经错过了机会。

【讨论】:

以上是关于在 Angular 中有没有办法将包含组件指令的 html 注入到父组件的模板中?的主要内容,如果未能解决你的问题,请参考以下文章

Angular2嵌套模板驱动表单

有没有办法在另一个组件中使用可变 Angular 组件,并将数据传递给该可变组件?

有没有办法让我的组件在角度上完全可重用?

Angular 1.5 组件路由器兄弟组件

在 Angular 结构指令中使用动态组件会产生额外的 HTML 标记。如何删除或更换它?

Angular如何将数据从指令传递到父组件