我正在反对的API为我提供了以下结构:
"data": [
{
"id": 5,
"name": "First name",
"parent": 0
},
{
"id": 1,
"name": "Second name",
"parent": 5
},
{
"id": 6,
"name": "Third name",
"parent": 1
},
{
"id": 15,
"name": "Fourth name",
"parent": 0
},
{
"id": 25,
"name": "Fifth name",
"parent": 5
}
]
我想使用支持无限数量子级别的ngFor
围绕此构建树结构。
这是我到目前为止所尝试的:
<div *ngFor="let d1 of _dataList">
<ul *ngIf="d1.parent == 0">
<li>
{{d1.name}}
<ul *ngFor="let d2 of _dataList">
<li *ngIf="d2.parent == d1.id">{{d2.name}}</li>
</ul>
</li>
</ul>
</div>
这很有效,但它很难看,我必须手动重复这个X级别的数据,从而留下硬编码限制。
如何优化此代码以支持无限级别 - 并且看起来更好?
答案 0 :(得分:2)
您可以拥有一个可追溯的组件,例如称为TreeComponent
的组件
TreeComponent
的模板将像这样
<div *ngFor="let item of dataList">
<ul *ngIf="item.parent==parentId">
<li>{{item.name}}
<tree [parentId]="item.id" [dataList]="removeCurrentLevelItems(dataList,parentId)"></tree>
</li>
</ul>
</div>
检查link here进行实时演示
答案 1 :(得分:1)
https://stackblitz.com/edit/angular-yij5e5?file=src%2Fapp%2Ftree-view%2Ftree-view.component.ts 注意:下面的代码不是递归的,它是2d,不能用于树渲染。 您应该使用ng模板或为其定义组件。
<div *ngFor="let d1 of _dataList">
<ul *ngIf="d1.parent == 0">
<li>
{{d1.name}}
<ul *ngFor="let d2 of _dataList">
<li *ngIf="d2.parent == d1.id">{{d2.name}}</li>
</ul>
</li>
</ul>
</div>
let xTree = [{
"id": 5,
"name": "First name",
"parent": 0
},
...
];
let tree = [{
id: 0,
name: 'root',
parent: null,
childs: []
}];
let todoList = [];
Converter();
function FindParent(list, el) {
if (list.length > 0) {
let res = list.find(x => x.id === el.parent);
if (res) {
return res;
} else {
let _res = undefined;
list.forEach(xchild => {
_res = FindParent(xchild.childs, el);
if (res)
return _res;
});
return _res
}
} else {
return undefined;
}
}
function Converter() {
todoList = xTree;
for (let x = 0; x < 90; x++) {
todoList.forEach(r => {
let parent = FindParent(tree, r);
if (parent) {
if (!parent.childs) {
parent.childs = [];
}
parent.childs.push(r);
todoList = todoList.filter(el => el !== r);
}
});
}
}
<ul class="tree">
<ng-template #recursiveList let-list="list">
<li *ngFor="let item of list">
{{item.name}}
<ul *ngIf="item.childSet.length > 0">
<ng-container *ngTemplateOutlet="recursiveList; context:{ list: item.data}"></ng-container>
</ul>
</li>
</ng-template>
<ng-container *ngTemplateOutlet="recursiveList; context:{ list: data}"></ng-container>
</ul>
ul.tree, ul.tree ul {
list-style-type: none;
}
ul.tree, ul.tree ul {
list-style-type: none;
background: url(/assets/vline.png) repeat-y;
margin: 0;
padding: 0;
}
ul.tree ul {
margin-left: 10px;
}
ul.tree li {
margin: 0;
padding: 0 12px;
line-height: 20px;
background: url(/assets/node.png) no-repeat;
color: #369;
font-weight: bold;
}
ul.tree li:last-child {
background: #fff url(/assets/lastnode.png) no-repeat;
}