【发布时间】:2020-06-21 16:45:35
【问题描述】:
我正在编写一个接受输入的简单节点树应用程序,但在显示通过输入创建的子节点时遇到问题。总体目标是打印输入到输入中的孩子的数量,以及所有在输入范围内的孩子。我显然可以打印一个新节点,但我的逻辑不能作为“root”的子节点工作,并且子节点的数量也没有打印。请帮忙。任何指导都会真正有帮助和赞赏。我是 Angular 的新手。我错过了什么?
这是我所拥有的:
nodetree.component.html
<div class="container">
<div class= "input-div">
<input type="text" class= "node-input" placeholder ="Enter a Name" [(ngModel)]="nodeName"
(keyup.enter)="addNode()">
<input type="text" class= "node-input" placeholder ="Number of Children" [(ngModel)]="nodeChildren"
(keyup.enter)="addNode()">
<input type="text" class= "node-input" placeholder ="Range Minimum" [(ngModel)]="nodeRangeMin"
(keyup.enter)="addNode()">
<input type="text" class= "node-input" placeholder ="Range Maximum" [(ngModel)]="nodeRangeMax"
(keyup.enter)="addNode()">
</div>
<div class="col-9 text-center">
<ul *ngIf="nodes">
<li class="row node" *ngFor="let node of nodes">
<span *ngIf="!node.editing; else editingNode" class="node-name" (dblclick)="editNode(node)">
> {{ node.name }}
</span>
<ng-template #editingNode>
<input type="text" class= "node-edit" [(ngModel)]="node.name" (blur)="editDone(node)" (keyup.enter)="editDone(node)" autofocus>
</ng-template>
<span class="node-range">
{{ node.rangeMin }}-{{ node.rangeMax }}
</span>
<div class="remove-node" (click)="deleteNode(node.name)">
×
</div>
</li>
</ul>
</div>
</div>
还有nodetree.component.ts
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'nodetree',
templateUrl: './nodetree.component.html',
styleUrls: ['./nodetree.component.scss']
})
export class NodetreeComponent implements OnInit {
nodes: Node[];
nodeName: string;
nodeChildren: Node[];
nodeRangeMin: number;
nodeRangeMax: number;
nodeChildNumber: number;
constructor() { }
ngOnInit() {
this.nodeName = '';
this.nodeRangeMin = undefined;
this.nodeRangeMax = undefined;
this.nodeChildren = [];
this.nodeChildNumber = undefined;
this.nodes = [
{
name: 'Root',
rangeMin: 12,
rangeMax: 20,
childNumber: undefined,
editing: false,
hasChildren: true,
showChildren: true,
children:[
{
name: 'Bob',
rangeMin: 17,
rangeMax: 30,
childNumber: undefined,
editing: false,
hasChildren: true,
showChildren: true,
children:[]
},
{
name: '',
rangeMin: undefined,
rangeMax: undefined,
childNumber: undefined,
editing: false,
hasChildren: false,
showChildren: true,
children:[]
},
]
}
]
}
addNode(): void {
// if(this.nodeName.trim().length === 0) {
// return;
// }
var nodeRangeMin = undefined,
nodeRangeMax = undefined,
nodeChildNumber= undefined,
nodeName = [];
var nodeName = [];
while(nodeName.length < nodeChildNumber){
var r = Math.floor(Math.random()*(nodeRangeMax - nodeRangeMin) + nodeRangeMin);
if(nodeName.indexOf(r) === -1) nodeName.push(r);
return;
}
this.nodes.push({
name: this.nodeName,
rangeMin: this.nodeRangeMin,
rangeMax: this.nodeRangeMax,
childNumber: this.nodeChildNumber,
editing: false,
hasChildren: false,
showChildren: false,
children:[]
})
this.nodeName = '';
this.nodeRangeMin = undefined;
this.nodeRangeMax = undefined;
this.nodeChildNumber = undefined;
}
deleteNode(name: string): void {
this.nodes = this.nodes.filter(node => node.name !== name);
}
editNode(node: Node): void {
node.editing = true;
}
editDone(node: Node): void {
node.editing = false;
}
toggleChild(node: Node) {
node.showChildren = !node.showChildren;
}
}
interface Node {
name: string;
rangeMin: number,
rangeMax: number,
childNumber: number,
editing: boolean;
hasChildren: boolean;
showChildren: boolean;
children: Node[];
}
【问题讨论】:
-
我不确定我是否理解这里的问题。你能告诉我这个stackblitz 有什么问题吗?
-
@BunyaminCoskuner 目前只推送名称和范围,而不是输入输入的孩子数量。如果您在“儿童数量”输入中输入 8,我希望它在“最小范围”和“最大范围”中给出的范围内打印出 8 个儿童。当然,我错过了一些步骤,但同样,我是 Angular 的新手。此外,如果父级也是可折叠的,那就太好了
-
我现在看到了,
node可以生孩子nodes可以生更多孩子。所以,你需要的是某种递归方法 -
这就是我以为我在做的事情
-
首先,确定
Node是什么。是li标签之间的模板吗?如果它有孩子,它应该怎么做?然后为此创建一个组件。通过Input传递其配置,其中可能包含children(Node[])。如果它有孩子,它应该渲染它们。