Angular 5:从组件访问元素内部 html 以获取动态生成的元素

Posted

技术标签:

【中文标题】Angular 5:从组件访问元素内部 html 以获取动态生成的元素【英文标题】:Angular 5: Access element inner html from the component for dynamically generated elements 【发布时间】:2019-01-10 05:55:57 【问题描述】:

我的组件中有一个角度组件,我需要访问元素的内部 html。为此,我可以使用带有模板参考的 ViewChild 为单个元素获取此信息。但是在 ngFor 中,当我动态生成元素和模板引用时,它不起作用。 这是控制台中显示的错误:-

Cannot read property 'native Element' of undefined

这里是单个元素的代码:-

@ViewChild('emailBodyContainer') emailBodyContainer: ElementRef;
<div [innerHtml]="emailTemplate.mailBody" #emailBodyContainer>

对于动态元素:-

<div *ngFor="let i of reminderTemplates" class="container tab-pane text-center py-4 [innerHtml]="i.mailBody" #i.type></div>

请帮我解决这个问题。 在此先感谢:)

【问题讨论】:

【参考方案1】:

试试这样的:

DEMO

<div *ngFor="let i of arr;let j = index" id=itemj>
    i
</div>

TS:

  import  Component, AfterViewInit  from '@angular/core';

@Component(
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
)
export class AppComponent implements AfterViewInit 

  arr: Array<any> = [1, 2, 3, 4]

  ngAfterViewInit() 
    let data1 = document.getElementById('item0')
    let data2 = document.getElementById('item1')
    let data3 = document.getElementById('item2')
    let data4 = document.getElementById('item3')
    console.log(data1)
    console.log(data2)
    console.log(data3)
    console.log(data4)
  

对于 Mat-Tab:

DEMO

import  Component, ViewChild, ElementRef, AfterViewInit  from '@angular/core';

@Component(
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
)
export class AppComponent implements AfterViewInit 
  @ViewChild("main") main: ElementRef;

  name = 'Angular';
  Tabs: Array<any> = [ name: 'Tab1' ,  name: 'Tab2' ,  name: 'Tab3' ]

  ngAfterViewInit() 
    let el = document.getElementById("main");


    console.log(el);

    let elh = el.children.item(0).children.item(1).children.item(0).children.item(0).children;

    elh.item(0).setAttribute("style", "color:red;")

    elh.item(1).setAttribute("style", "color:green;")

    elh.item(2).setAttribute("style", "color:cyan;")
  


HTML:

<mat-tab-group id = "main">
    <mat-tab *ngFor="let tab Of Tabs;let i= index" [label]="tab.name"> Content i </mat-tab>
</mat-tab-group>

【讨论】:

它已经适用于单个组件。但是动态生成的元素有问题。 见上面的演示。 它对我不起作用。为了您的信息,我在 MatTab 中使用了 ngfor。 感谢您的回答。我的问题解决了。我的问题是当前选择的标签。【参考方案2】:
You can use something like this.

<div *ngFor="let i of reminderTemplates" class="container tab-pane text-center py-4 [innerHtml]="i.mailBody" #items></div>

In component:

@ViewChildren('items') items: QueryList<ElementRef>;

console.log(this.items); // print the list of items

【讨论】:

感谢您的回复。它适用于您的情况,但不适用于:- this.items.forEach(item => console.log(item.nativeElement.innerHTML); ); HI Suresh,您有以上问题的解决方案吗? 请检查您的代码?它有效吗?它不适合我。

以上是关于Angular 5:从组件访问元素内部 html 以获取动态生成的元素的主要内容,如果未能解决你的问题,请参考以下文章

如何从 html 页面获取内部 html 并将其显示在 Angular 组件上?

Angular Material:如何从组件中的方法内部而不是从 html 关闭 MatSidenav?

Angular 5数据从组件的一个子组件访问组件

如何使用 Angular 4 从 Parent 获取子 DOM 元素引用

如何访问 Angular2 中的 HTML 视频元素

Angular:使用 NgIf 删除组件、内部表单和元素?