gpt4 book ai didi

javascript - Angular JS 2 中模板元素的递归

转载 作者:行者123 更新时间:2023-11-28 05:33:35 26 4
gpt4 key购买 nike

我在 Angular 2 中遇到了一种情况。我必须根据 child 迭代 ngFor 。我的组件应该能够根据给定的输入呈现列表。这是数据结构

[
{
name: 'ABCD',
child:[
name: 'A1',
child:[
name: 'A1.1',
child:[....]
]
]
}
]

现在我尝试通过操作 DOM 使用组件生命周期 ngOnInit 在模板中渲染此结构,并且它正在工作。

除了在 Angular 2 中操作 DOM 之外,还有其他方法吗?可能是通过在模板内使用 ngFor 或其他东西。我尝试了很多方法,但没有成功。

更新:尝试过 DOM 操作

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

@Component({
selector: 'multiple-drop-down',
template: `
<div class="dropdown">
<button id="dLabel" type="button" class="btn btn-primary"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{{selected.size}} item selected<span class="caret"></span>
</button>
<ul class="dropdown-menu treeview" aria-labelledby="dropdownMenu">
<li id="item-lists">
<a href="javascript:void(0);" (click)="toggleItemSelect($event)">
<input (change)="selectAll($event)" type="checkbox" id="checkbox-select-all">
<label for="tall" class="custom-unchecked">Select All</label>
</a>
</li>
</ul>
</div>
`,
})
export class MultipleDropDownComponent implements OnInit {
menuItemList: Array<MenuObject>;
selected: Set<string>;

constructor() {
this.selected = new Set<string>();
this.menuItemList = [
{ name: 'item 1', id: 'A', child: [
{ name: 'item 1.1', id: 'A1', child: [
{ name: 'item 1.11', id: 'Aa1', child: []},
{ name: 'item 1.12', id: 'Aa2', child: []},
{ name: 'item 1.13', id: 'Aa3', child: []}
]},
{ name: 'item 1.2', id: 'A2', child: []}]},
{ name: 'item 2', id: 'B', child: []},
{ name: 'item 3', id: 'C', child: []},
{ name: 'item 4', id: 'D', child: []}];
}

ngOnInit() {

// calling render method to populate dropdown values
this.renderChildElements('item-lists', this.menuItemList , 'first');
}

renderChildElements(id: string, items: MenuObject[], key: string): void {
let parent = this.createULElement(id, key);
items.forEach((element: MenuObject) => {
let Li = document.createElement('li');
Li.setAttribute('id', element.id);
Li.innerHTML = `<a href="javscript:void(0);"
(click)="toggleItemSelect($event)">
<input type="checkbox" name="` + element.name + `"
id="` + element.id + `" (click)="toggleMultiSelect($event, ` + element + `)">
<label for="tall-1" class="custom-unchecked">` + element.name + `</label>
</a>`;
document.querySelector('#' + parent).appendChild(Li);

// this condition is responsible for recurrsion process
if ( element.child.length > 0 ) {
this.renderChildElements(element.id, element.child, element.id);
}
});
}
  createULElement(parentId: string, childId: string): string {
let ulId = childId + 'ul';
let newUl = document.createElement('ul');
newUl.setAttribute('id', ulId);
document.querySelector('#' + parentId).appendChild(newUl);
return ulId;
}
}
export interface MenuObject {
id: string;
name: string;
child?: MenuObject[];
}

最佳答案

这应该可以满足您的要求:

@Component({
selector: 'child',
template: `
<div>{{data?.name}}</div>
<child [data]="data?.child]></child>`
})
class ChildComponent {
@Input() data;
}
@Component({
selector: 'my-app',
template: `
<child [data]="data?.child]></child>`
})
class ChildComponent {
data = [
{
name: 'ABCD',
child:[{
name: 'A1',
child:[{
name: 'A1.1',
child:[....]
}]
}]
}
];
}

关于javascript - Angular JS 2 中模板元素的递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39525769/

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