Angular2 [innerHtml] angular2 标签不起作用

Posted

技术标签:

【中文标题】Angular2 [innerHtml] angular2 标签不起作用【英文标题】:Angular2 [innerHtml] angular2 tag doesn't work 【发布时间】:2017-05-20 14:19:44 【问题描述】:

我想用来自另一个组件的 angular2 标签在我的 a-component 中注入 html

@Component(
  selector: 'app-root',
  template: '<app-a [my-html]="my-html"> </app-a>',
  styleUrls: ['./app.component.css']
)
export class AppComponent 
  my-html= '<span> variableFromAComponent</span>';




@Component(
      selector: 'app-a',
      template: '<div [innerHtml]="my-html"> </div>',
    )
    export class AComponent 
      @Input('my-html') my-html:any;
      public variableFromAComponent='its work!'; 
    

我想看到结果:它的工作! (来自 variableFromAComponent)但我看到 variableFromAComponent(angular2 标签不起作用)。

【问题讨论】:

【参考方案1】:

我在angular2-dynamic-component找到了解决方案

<template dynamic-component
          [componentContext]="self"
          [componentModules]="dynamicExtraModules"
          [componentTemplate]='"here html tags with angular2 tags"'>
</template>

【讨论】:

【参考方案2】:

Angular 根本不处理 [innerHTML]="..." 添加的 HTML。它只是按原样添加,仅此而已。您甚至可能需要使用 Sanitizer,因此出于安全原因,不会删除任何内容(请参阅 In RC.1 some styles can't be added using binding syntax)。

如果你想动态添加组件,你可以使用ViewContainerRef.createComponent(),例如Angular 2 dynamic tabs with user-click chosen components中的解释

【讨论】:

当然不是。正如我所说,Angular2 不会为以这种方式添加的 HTML 创建组件。 我看了你的加载动态标签的例子。我不想加载组件,我想用 Angular2 标签加载我的 html。我的任务 - 从服务器加载带有 angular2 标签的 html 并将其呈现在另一个组件中。 有一些答案显示了如何在运行时创建新组件。这是从运行时加载的 HTML 创建组件的唯一方法。搜索$compile(目前只能在手机上) 非常感谢您的帮助。我拿了angular2-dynamic-component【参考方案3】:

有几种方法可以做到这一点。

COMPONENT INTERACTION

如果组件之间存在父/子关系,则可以使用Input()Output() 在它们之间传递值

这个子组件通过Input()获取值

child.component.ts

import  Component, Input  from '@angular/core';
@Component(
  selector: 'child',
  template: '<div>myHtml</div>', // these curly braces add the text as innerHTML
  providers: [ FoodsService]
)
export class ChildComponent implements OnInit 
   @Input() myHtml: string;

通过模板从父级传递过来的:

parent.component.html

<child [myHtml]="'You're String Here (or a variable set to "its work")'"></child>

您可以使用Output() 从孩子转到父母。

SERVICES

另一种方法是创建一个注入到两个组件中的服务。一个组件可以向服务发送一个值,而另一个组件可以获取该值。在 Angular2 中,这通常通过对数据对象使用 observables 来实现。

【讨论】:

我不只是使用innerHtml。我尝试了你的解决方案,结果 - html 标签和 angular2 标签不起作用【参考方案4】:

您可以为此使用Renderer2 Class。

import  ElementRef, Renderer2  from '@angular/core';

constructor (
  private elementRef: ElementRef,
  private renderer: Renderer
) 

public ngAfertViewInit(): void 
  this.renderer
     .setElementProperty(
        this.elementRef.nativeElement, 
        'innerHTML',
        '<h1> Nice Title </h1>'
     );

【讨论】:

@Andrei 上周我能够在服务器上使用它渲染 d3 图表,它是实验性的,但如果对您不起作用,请改用 Renderer 类。

以上是关于Angular2 [innerHtml] angular2 标签不起作用的主要内容,如果未能解决你的问题,请参考以下文章

带有变量 angular2 的 innerHTML

Angular2 innerHtml绑定删除样式属性[重复]

ngModel innerHTML 在 p 标签中有效,但在输入标签 angular2 中无效

angular 2 [innerHTML] 在 html 内渲染(不适用于 angular 2)[重复]

无法从 innerHTML 获取动态数据 - Angular

Angular 2 innerHTML 忽略表单标签