当前位置: 首页 > 面试题库 >

Angular2将HTML添加到动态元素

李弘光
2023-03-14
问题内容

我有以下代码:

import { Component, ElementRef, Renderer2 } from '@angular/core';

@Component({
    selector: 'my-app',
    template: '<button (click)="runR()">Run</button>
<div class="testme">
    <div class="somediv">
        <div class="dynamically_created_div unique_identifier"></div>
        <div class="dynamically_created_div unique_identifier"></div>
        <div class="dynamically_created_div unique_identifier"></div>
    </div>
</div>',
})

export class AppComponent{
    hostEl: any;

    constructor(
        private el:ElementRef,
        private renderer:Renderer2,
    )  {
        this.hostEl = el.nativeElement;
    }

    runR(){
        let change_this;
        change_this= this.renderer.createElement('span');
        this.renderer.addClass(change_this, 'change_this');
        this.renderer.appendChild(this.hostEl, change_this);      
    }

}

Angular2中 有什么方法可以将HTML添加到中.dynamically_created_div吗?因为上述内容仅添加到组件HTML的末尾。

我也尝试过:

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

@Component({
  selector: 'my-app',
  template: `<button (click)="runR()">Run</button>
<div class="testme">
    <div class="somediv">
        <div class="dynamically_created_div">

        </div>
    </div>
</div>
  `,
})
export class AppComponent {
  constructor(private renderer:Renderer) {}

    runR() {
        @ViewChild('dynamically_created_div') d1:ElementRef;
        this.renderer.invokeElementMethod(this.d1.nativeElement, 'insertAdjacentHTML', ['beforeend', '<div class="new_div">new_div</div>'] );
    }

}

但这是行不通的,因为@ViewChild指令必须在函数之外,我再也无法控制它了

我也这样尝试过:

<div class="dynamically_created_div" [innerHtml]="newHTML"></div>
this.newHTML = '<div class="new_div">new_div</div>';

我不能做的事情是因为我的内容是动态的并且使用唯一的ID,并且我不能动态使用[innerHtml](它仅适用于我第一次放入它们的面板,然后其他任何更改都不能再使用innerHtml。

我检查了Angular2:在DOM中将动态组件作为容器的子代插入,但是存在相同的问题,占位符不是动态的

更新:

我的代码稍微复杂一点:

TS:

import { AfterContentInit, Component, OnInit, OnDestroy, ViewEncapsulation } from '@angular/core';
import { NgForm, FormsModule, ReactiveFormsModule, FormGroup, FormControl, FormBuilder, Validators } from '@angular/forms';
import { SFService } from '../services/sf.service';
import { Injectable, Pipe, PipeTransform } from '@angular/core';

@Component({
    selector: 'my-app',
    templateUrl: './app.component.html',
    providers: [ SFService ],
})

export class AppComponent implements OnInit {
    constructor(
        private sfservice: SFService,
    ) {}

    ngOnInit(){
        this.sfservice.getMembers().subscribe(members => {
            this.members = members.members;
        });
    }


    members: Member[];
    member_selector: Member[];

    member_each: Member;
    member_selector_each: Member[];
    cases: Case;

    runR(){

        this.members.forEach(member_each => {
            this.member_selector.forEach(member_selector_each => {
                if(member_each.Id === member_selector_each.Id){
                    console.log(member_selector_each.Id);
                    this.sfservice.getCaseHistory(member_selector_each.Id, "2017-04-25T00:00:00", "2017-04-28T23:59:59").subscribe(cases => {

                        this.member_each['cases'] = cases;
                        console.log(this.member_each);
                    });
                }
            })
        })
    }
}

HTML:

<form #myForm="ngForm" novalidate>
    <select name="member_selector_name" [(ngModel)]="member_selector" multiple ng-model="selectedValues" style="height:200px;">
        <option *ngFor="let member of members" [ngValue]="member">{{member.Name}}</option>
    </select>
    <button (click)="runR()">Run</button>
</form>

<div id="results">
    <div *ngFor="let mem of members" class="member-card-{{mem.Id}}">
        <div class="card-container">
             <div *ngFor="let case of mem.Cases" class="case-card" id="{{case.Id}}">{{case.Number}}
             </div>
        </div>
    </div>
</div>

我只是尝试使用,ngFor但现在我得到了

Cannot set property 'cases' of undefined

问题答案:

这种方法有什么问题?

export class AppComponent{
    @ViewChild('d1') d1:ElementRef;
    @ViewChild('d2') d2:ElementRef;
    @ViewChild('d3') d3:ElementRef;

    constructor(private renderer:Renderer2)  {    }

    runR(){
        let change_this;
        change_this= this.renderer.createElement('span');
        this.renderer.addClass(change_this, 'change_this');
        this.renderer.appendChild(this.d1, change_this);
    }

}

模板:

<div class="dynamically_created_div unique_identifier" #d1></div>
<div class="dynamically_created_div unique_identifier" #d2></div>
<div class="dynamically_created_div unique_identifier" #d3></div>


 类似资料:
  • 我读过许多关于动态添加字段集的博客和帖子,但它们都给出了非常复杂的答案。我要求的不是那么复杂。 我的HTML代码: 因此,用户将在字段中输入一个整数值(我正在使用javascript检查验证)。点击链接,会出现相应数量的输入字段供他输入。我想用javascript实现这一点。 我不是javascript方面的专家。我在想如何通过链接检索用户在字段中填写的整数,并显示相应数量的输入字段。

  • 问题内容: 我想将onclick事件绑定到我使用jQuery动态插入的元素 但是它从不运行绑定函数。如果您能指出此示例为何不起作用以及如何使其正常运行,我将不胜感激: 编辑:我编辑了该示例以包含方法插入到其中的两个元素。在这种情况下,将永远不会执行该调用。 问题答案: 第一个问题是,当您在具有多个元素的jQuery集合上调用append时,会为每个元素创建要添加的元素的克隆,因此丢失了附加的事件观

  • 问题内容: 我已经有了一个状态: 现在,我想用新信息对其进行更新。因此,向其添加另一个div。 像这样: 我该怎么做?或者我需要从零开始设置新状态 问题答案: 我认为以组件状态存储jsx组件不是一个好主意。我认为您应该仅以呈现组件所需的状态保存数据。 如果您真的想在状态中存储jsx,为什么不将“对话”属性定义为数组?然后,您可以向其中添加新组件。 但是最好只存储数据,例如“ first”和“ ne

  • 添加画笔动态 “画笔”面板提供了许多用于向预设画笔笔尖添加动态(或变化)元素的选项。例如,可以设置在描边路线中改变画笔笔迹的大小、颜色和不透明度的选项。 将动态元素添加到画笔时使用两个组件: 抖动百分比指定动态元素的随机性。如果是 0%,则元素在描边路线中不改变;如果是 100%,则元素具有最大数量的随机性。 “控制”弹出式菜单中的选项指定如何控制动态元素的变化。可以选择不控制元素的变化,按指定数

  • 问题内容: 我想将通过JSOn格式的URL接收的数据动态附加到我的列表视图中。但是我不知道它是如何工作的。 移动网站以以下格式检索对象: 在.html中,我有一个listview和一个函数,在其中尝试附加接收到的数据。我只展示身体。 也许这很容易,但是我是Web编程的新手,我不知道该如何附加检索到的数据。 有人可以帮我吗? 问题答案: 这是上述解决方案的jsfiddle(还有一个使用 代替的示例

  • 我正在尝试使用Java中的Swing制作一个GUI,它可以执行以下操作: 当按下“添加”按钮时,会创建一个JPanel,并填满图形用户界面的整个宽度。在JPanel中,JLabels将使用FlowLayout来排列,该FlowLayout告诉特定的细节(例如名称、用户ID等)。每当随后按下添加按钮时,我都希望在前面的按钮下添加一个新的JPanel,以便JScrollPane在必要时激活其垂直滚动条