从描述父子关系的数据生成树视图
Generate a tree view from data describing parent-child relations
给定输入数据
+-------+---------+
| node | subnode |
+-------+---------+
| 3 | 6 |
| 3 | 7 |
| 3 | 8 |
| 3 | 9 |
| 6 | 8 |
| 7 | 9 |
| 9 | 8 |
+-------+---------+
例如作为二维数组:
const tree = [
[3, 6],
[3, 7],
[3, 8],
[3, 9],
[6, 8],
[7, 9],
[9, 8]
];
描述这棵树:
3
├─ 6
│ └─ 8
├─ 7
│ └─ 9
│ └─ 8
├─ 8
└─ 9
└─ 8
如何实施 Angular 解决方案以在网页上显示此内容 让我们说嵌套 <div>
就像
<div id="node3" style="padding-left:2em">3<div id="node6" [...]</div>
?插图:
Günter Zöchbauer 链接了他的 这适用于树视图 "passive" 的简单情况,因此它只是将一些数据可视化为静态元素。
然而,如果模板中的树和组件之间应该有通信(例如,节点有一个 (click)
事件调用组件中定义的方法),因为 Günter 的解决方案使用递归自包含组件,每个节点都有自己的指令,可能会遇到问题:
由于组件的重复创建了多个范围,因此很难从组件中将树作为一个整体来处理。 (- 如果我错了请纠正我。)
这就是为什么我需要另一个仅模板的解决方案,并且这种方式不会导致为每个节点复制组件。这是:
在.ts中:
const nodes = [{
number: 3,
children: [{
number: 6,
children: [{
number: 8,
children: []
}]
}, {
number: 7,
children: [{
number: 9,
children: [{
number: 8,
children: []
}]
}]
}, {
number: 8,
children: []
}, {
number: 9,
children: [{
number: 8,
children: []
}]
}]
}];
中.html:
<ng-template #recursion let-nodes>
<div style="margin-left:2em" *ngFor="let node of nodes">
{{node.number}}
<ng-container *ngIf="node.children.length > 0">
<ng-container *ngTemplateOutlet="recursion;
context:{ $implicit: node.children }"></ng-container>
</ng-container>
</div>
</ng-template>
<ng-container *ngTemplateOutlet="recursion;
context:{ $implicit: nodes }"></ng-container>
P.S.: 请参阅these answers了解如何将tree
转换为nodes
.
给定输入数据
+-------+---------+
| node | subnode |
+-------+---------+
| 3 | 6 |
| 3 | 7 |
| 3 | 8 |
| 3 | 9 |
| 6 | 8 |
| 7 | 9 |
| 9 | 8 |
+-------+---------+
例如作为二维数组:
const tree = [
[3, 6],
[3, 7],
[3, 8],
[3, 9],
[6, 8],
[7, 9],
[9, 8]
];
描述这棵树:
3
├─ 6
│ └─ 8
├─ 7
│ └─ 9
│ └─ 8
├─ 8
└─ 9
└─ 8
如何实施 Angular 解决方案以在网页上显示此内容 让我们说嵌套 <div>
就像
<div id="node3" style="padding-left:2em">3<div id="node6" [...]</div>
?插图:
Günter Zöchbauer 链接了他的
然而,如果模板中的树和组件之间应该有通信(例如,节点有一个 (click)
事件调用组件中定义的方法),因为 Günter 的解决方案使用递归自包含组件,每个节点都有自己的指令,可能会遇到问题:
由于组件的重复创建了多个范围,因此很难从组件中将树作为一个整体来处理。 (- 如果我错了请纠正我。)
这就是为什么我需要另一个仅模板的解决方案,并且这种方式不会导致为每个节点复制组件。这是:
在.ts中:
const nodes = [{
number: 3,
children: [{
number: 6,
children: [{
number: 8,
children: []
}]
}, {
number: 7,
children: [{
number: 9,
children: [{
number: 8,
children: []
}]
}]
}, {
number: 8,
children: []
}, {
number: 9,
children: [{
number: 8,
children: []
}]
}]
}];
中.html:
<ng-template #recursion let-nodes>
<div style="margin-left:2em" *ngFor="let node of nodes">
{{node.number}}
<ng-container *ngIf="node.children.length > 0">
<ng-container *ngTemplateOutlet="recursion;
context:{ $implicit: node.children }"></ng-container>
</ng-container>
</div>
</ng-template>
<ng-container *ngTemplateOutlet="recursion;
context:{ $implicit: nodes }"></ng-container>
P.S.: 请参阅these answers了解如何将tree
转换为nodes
.