D3 Collapsable Tree - Свернуть один уровень за раз - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть разборное дерево d3.У меня есть внешняя кнопка, которая контролирует расширение и свертывание дерева.Я могу расширять все, складывать все.А также, я могу расширить один уровень за раз.У меня возникают проблемы при сворачивании одного уровня за раз.

Для любого без предварительного понимания d3. Если узел развернут, то d.children не пуст и & d. children пуст, а если узел свернут, d .children не пуст и d.children пуст .

Вот моя логика для расширения на один уровень:

private expandNodeOneLevel(d) {
    var children = (d.children) ? d.children : d._children;
    if (!d.children) {
       if (children) {
           d.children = d._children;
           d._children = null;
       }
       return;
     }
    if (children) {
       children.forEach((node) => this.expandNodeOneLevel(node));
     }
}



 public expandOneLevelNodes() {
    this.expandNodeOneLevel(this.root);
    this.update(this.root);
  }

Вот моя логика для свертывания одного уровня за раз, что неверно, так как сворачивает все узлы дерева.У меня проблемы с нарушением рекурсии.

private collpaseOneLevelNodes = (d) => {
    var children = (d.children) ? d.children : d._children;
    if (!children) {
      return;
    }
    children.forEach((node) => {
      this.collpaseOneLevelNodes(node);
    });
    if (d.children) {
        d._children = d.children;
        d.children = null;
    }
    return;
  }



 public collapseOneLevel() {
    this.collpaseOneLevelNodes(this.root);
    this.update(this.root);
  }

Буду очень признателен, если кто-нибудь укажет, где моя ошибка, или любой другой лучший подход.

1 Ответ

0 голосов
/ 26 сентября 2018

понял это.Не заметил, что d3 предоставляет информацию о родителе.

 private collpaseOneLevelNodes = (d) => {
var children = (d.children) ? d.children : d._children;
if (!children || !d.children) {
  if (!d.parent._children) {
    d.parent._children = d.parent.children;
    d.parent.children = null;
  }
  return;
}
if (d.children) {
  children.forEach((node) => {
    this.collpaseOneLevelNodes(node);
  });
}

}

 public collapseOneLevel() {
    this.collpaseOneLevelNodes(this.root);
    this.update(this.root);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...