如何使用 Angular 2 组件动态添加 innerHTML

Posted

技术标签:

【中文标题】如何使用 Angular 2 组件动态添加 innerHTML【英文标题】:How to dynamically add innerHTML with angular 2 components 【发布时间】:2017-03-21 07:29:09 【问题描述】:

我正在为组件库创建文档。我想要 1 个 html 字符串来生成页面上的组件和它的文档。

我想要什么:

我有什么:

当我检查 HTML 时,我的按钮标签不存在。当我使用 innerHTML 时,它们会被删除。

我的组件代码:

private flatButtons = `<div class="button-wrapper">
      <my-button [type]="'default'" [raised]="false">Default</my-button>
    </div>
    <div class="button-wrapper">
      <my-button [type]="'primary'" [raised]="false">Primary</my-button>
    </div>
    <div class="button-wrapper">
      <my-button [type]="'success'" [raised]="false">Success</my-button>
    </div>
    <div class="button-wrapper">
      <my-button [type]="'info'" [raised]="false">Info</my-button>
    </div>
    <div class="button-wrapper">
      <my-button [type]="'warning'" [raised]="false">Warning</my-button>
    </div>
    <div class="button-wrapper">
      <my-button [type]="'danger'" [raised]="false">Danger</my-button>
    </div>`

constructor() 

getCode() 
    return html_beautify(this.flatButtons, this.options)

我的 HTML 模板:

<div class="row">
<div class="col-sm-6 col-xs-12">
  <mi-card title="Flat Buttons" baCardClass="with-scroll button-panel">
    <div id="flatButtons" [innerHTML]="getCode()">
    </div>
  </mi-card>
</div>
<div class="col-sm-6 col-xs-12">
  <pre>getCode()</pre>
</div>

【问题讨论】:

您希望发生什么? 我期待“我想要什么:”之后的图片 好的,所以你希望添加的 HTML 成为真正的 Angular 组件。这种方式行不通。看我的回答。 这对我有用:***.com/a/43862386/1048800 也许这会有所帮助:github.com/apoterenko/angular2-dynamic-component 【参考方案1】:

Angular 不处理动态添加的 HTML,它只是逐字添加它,除了一些清理以防止安全问题。 请参阅In RC.1 some styles can't be added using binding syntax 以了解如何防止 sanitizer 剥离 HTML。

您可以使用ViewContainerRef.createComponent() 中的Angular 2 dynamic tabs with user-click chosen components 来动态添加组件。

还有一些可用的解决方案如何动态创建组件,如Equivalent of $compile in Angular 2所示

【讨论】:

【参考方案2】:

我会接受 Gunter 的回答,因为它回答了我的问题。

对于那些感兴趣的人,我解决问题的方法是创建一个组件并要求它。

我创建了一个哑组件:

import Component from '@angular/core';


@Component(
  selector: 'flat-buttons',
  template: require('./flatButtons.html'),
)
export class FlatButtons 

  constructor() 
  

然后是我修改后的html模板:

<div class="col-sm-6 col-xs-12">
  <mi-card title="Flat Buttons" baCardClass="with-scroll button-panel">
    <flat-buttons></flat-buttons>
  </mi-card>
</div>
<div class="col-sm-6 col-xs-12">
  <h3>Code Snippet</h3>
  <div class="well">
    <pre>getFlatButtons()</pre>
  </div>
</div>

还有我修改过的组件代码:

private flatButtons = require('./components/flatButtons/flatButtons.html')

constructor() 

getFlatButtons() 
    return html_beautify(this.flatButtons, this.options)

【讨论】:

collinglass,你的 flatButtons.html 看起来怎么样?可以分享一下吗?

以上是关于如何使用 Angular 2 组件动态添加 innerHTML的主要内容,如果未能解决你的问题,请参考以下文章

使用 Angular,如何在点击时动态添加组件? (不止一个)

Angular 表单:如何动态添加/删除子表单组件

如何在 Angular 2 中动态更改 :host 中的 CSS?

在 Angular 中动态添加和删除组件

如何在动态添加的组件上使用事件发射器?

如何在角度2中显示动态添加的组件列表