Угловая рекурсия для обхода иерархической структуры - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть следующий код, в котором «currentNode» - это узел, который был выбран на уровне иерархии.Это JSON, имеющий пары ключ-значение.У него есть такие ключи, как «children», «selected» и т. Д.

Я хочу выполнить рекурсию, чтобы всякий раз, когда выбирался узел (выбранная функция имела выбранный «currentNode»), проверяла, есть ли у него потомки,Если нет, просто передайте currentNode.Если у него есть дочерние элементы, выполните рекурсию, чтобы передать узлы с атрибутом «Selected = true».

В моем текущем коде я могу получить выбранные дочерние узлы только до глубины одного уровня.

checkbox-tree.component.ts:

import { Component, EventEmitter, Output } from '@angular/core';
import { TreeNode } from './../../dto/TreeNode';
import { BaseTreeComponent } from './../base-tree/base-tree.component';
import { Subject } from 'rxjs/Subject';

import html from './checkbox-tree.component.html';
import css from '../fortune-select.component.css';

@Component({
  selector: 'checkbox-tree',
  template: html,
  styles: [css],
})

export class CheckboxTreeComponent<T> extends BaseTreeComponent<T> {

  //gets called when a node is selected
  public selected():void {

      if(this.currentNode.children.length !== 0) {
      this.currentNode.children.forEach(child => {if(child.selected = true) {
       this.sliceSelected.emit(child);

      //should ideally check again if child has children and if the child nodes are selected

      }})}
      else {
        this.sliceSelected.emit(this.currentNode); 
      }

    if(!this.linked || (this.currentNode.indeterminate && !this.currentNode.selected)) {
      this.dataChangedEvent();
      return;
    }

    this.currentNode.indeterminate = false;
    if(this.singleLevelOnly) {
      this.currentNode.selectChildrenSingleLevel(this.currentNode.selected);
    } else {
      this.currentNode.selectChildren(this.currentNode.selected);
    }

    this.childChanged.emit();
    this.dataChangedEvent();
  }

}
...