【问题标题】:How to push Children in Angular如何在 Angular 中推动儿童
【发布时间】: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)">
                    &times;
                </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[])。如果它有孩子,它应该渲染它们。

标签: angular tree children


【解决方案1】:

根据我们的谈话,您需要以下解决方案。

这是一个有效的blitz

让我们总结一下您要做什么。

您将拥有一个root 并使用给定的name numberOfChildren rangeMinrangeMax 创建children。这个孩子将拥有与numberOfChildren 一样多的孩子,他们的名字将在rangeMinrangeMax 之间随机决定。

让我们创建一个ChildComponent

child.component.ts

export type ChildModel = {
  name: string;
  rangeMin: number;
  rangeMax: number;
  children: number[];
};

@Component({
  selector: 'app-child',
  templateUrl: './child.component.html',
  styleUrls: ['./child.component.css']
})
export class ChildComponent implements OnInit {

  @Input() model: ChildModel;

  constructor() { }

  ngOnInit() {
  }

}

child.component.html

<ng-container *ngIf="model">
  <span>
    > {{ model.name }}
  </span> 
  <span class="node-range">
    {{ model.rangeMin }}-{{ model.rangeMax }}
  </span>

  <ul>
    <li *ngFor="let child of model.children">
      {{child}}
    </li>
  </ul>

</ng-container>

这里是

parent.component

@Component({
  selector: 'app-parent',
  template: `

     <div class= "input-div">
        <input type="text" class= "node-input" placeholder ="Enter a Name" [(ngModel)]="nodeName" 
        (keyup.enter)="addNode()">
        <input type="number" class= "node-input" placeholder ="Number of Children" [(ngModel)]="nodeChildren" 
        (keyup.enter)="addNode()">
        <input type="number" class= "node-input" placeholder ="Range Minimum" [(ngModel)]="nodeRangeMin" 
        (keyup.enter)="addNode()">
        <input type="number" class= "node-input" placeholder ="Range Maximum" [(ngModel)]="nodeRangeMax" 
        (keyup.enter)="addNode()">
    </div>

    <app-child *ngFor="let child of children" [model]="child"></app-child>
  `
})
export class ParentComponent implements OnInit {

  children: ChildModel[] = [];

  nodeName = '';
  nodeChildren = 0;
  nodeRangeMin = 0;
  nodeRangeMax = 0;

  constructor() { }

  ngOnInit() {
  }

  addNode() {
    this.children.push({
      name: this.nodeName,
      rangeMin: this.nodeRangeMin,
      rangeMax: this.nodeRangeMax,
      children: this.generateChildren()
    });
    this.clearInputs();
  }

  private generateChildren() {
    return [...new Array(this.nodeChildren).fill(0)].map(_ => this.getRandom());
  }

  getRandom() {
    return Math.floor(Math.random()*(this.nodeRangeMax - this.nodeRangeMin) + this.nodeRangeMin);
  }

  clearInputs() {
    this.nodeName = '';
    this.nodeChildren = 0;
    this.nodeRangeMin = 0;
    this.nodeRangeMax = 0;
  }
}

【讨论】:

    猜你喜欢
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 2021-12-30
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多