gpt4 book ai didi

html - 如何在 Angular 4 中使用 renderer2 动态追加子项

转载 作者:行者123 更新时间:2023-12-05 03:06:40 26 4
gpt4 key购买 nike

我是 Angular 4 的新手,需要使用 html 列表在子项下添加子项。

@Component({

selector: 'my-app',

template:`
<div>
<ul #root (click)="getChild($event)">root</ul>
</div>
`
})

export class App implements OnInit {

name:string;

@ViewChild('root') root;
constructor( private renderer : Renderer2) {

}

ngOnInit() {

}

getChild(evt) {

let li = this.renderer.createElement('li');
let span = this.renderer.createElement('span');
let text = this.renderer.createText('Child');
this.renderer.appendChild(span, text);
this.renderer.appendChild(li, span);
this.renderer.appendChild(this.root.nativeElement, li)
}
}

如何在<li>中动态绑定(bind)点击事件, 当点击触发时应该在 <ul> 中得到新的 child 在各自的 parent 下 <li> .树应该动态增长 n 个数字。

预期结果:

<div>
root
<ul>
<li>
<span> child </span>
<ul>
<li>
<span> child </span>
<ul>
<li>
<span> child </span>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>

每当我点击 <li> ,应该用事件以上述格式呈现各自的 child 。

解决方案将不胜感激。谢谢。

最佳答案

我从以下链接整理了演示

Check demo

我所做的是创建一个名为 NodeComponent 的组件这将创建树的节点。

节点组件.ts

@Component({
selector: 'my-node',
template: `
<span>{{text}}</span>
<button (click)="addChild()">Add Child!</button>
<ul>
<li *ngFor="let child of children">
<my-node [text]="child"></my-node>
</li>
</ul>
`
})
export class NodeComponent implements OnInit {

@Input() text;
children: string[];

ngOnInit() {}

addChild() {
if (!this.children) {
this.children = [];
}
const childText = `${this.text} - ${this.children.length + 1} - child`;
this.children.push(childText);
}
}

它需要一个输入,text并包含一个按钮来添加更多的 child 。当用户单击按钮时,它会将另一个文本推送到 children将使 Angular 添加另一个的数组 my-node DOM 组件。

在另一个组件中,你使用它如下

<my-node text="root"></my-node>

编辑

Check this second demo with nested json object

要从嵌套的 json 对象创建树,让我们重构 NodeComponent到以下

import { Component, OnInit, Input } from '@angular/core';

export interface NodeItem {
text: string;
children?: NodeItem[];
}

@Component({
selector: 'my-node',
template: `
<span>{{options.text}}</span>
<button (click)="addChild()">Add Child!</button>
<ul>
<li *ngFor="let child of options.children">
<my-node [options]="child"></my-node>
</li>
</ul>
`
})
export class NodeComponent implements OnInit {

@Input() options: NodeItem;

ngOnInit() {}

addChild() {
if (!this.options.children) {
this.options.children = [];
}
const childText = `${this.options.text} - ${this.options.children.length + 1} - child`;
this.options.children.push({text: childText});
}
}

并且,要在另一个组件中使用它,您只需执行以下操作

<my-node [options]="options"></my-node>

在组件中

options: NodeItem;

ngOnInit() {
this.options = {
text: 'root',
children: [{
text: 'root child 1',
}, {
text: 'root child 2',
children: [{
text: 'root child 2 child 1'
}]
}]
}
}

关于html - 如何在 Angular 4 中使用 renderer2 动态追加子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48984199/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com