如何获取Angular-tree-component上所有子节点的id?

时间:2017-07-31 18:54:07

标签: angular

我正在使用Angular-Tree-Component在我的应用程序上显示树视图。但是一旦在节点上,我需要得到该节点下的所有孩子的列表以及他们的孩子。

我看到他们的文档doForAll上有一个函数,它是为我所在节点下的每个节点调用的。

https://rawgit.com/500tech/angular-tree-component/master/doc/interfaces/api.itreenode.html#doforall

我可以调用该函数,当我执行console.log时它工作正常,但是当我尝试将节点的ID推送到我的数组时,我只得到第一个元素。

  getChildren(node: TreeNode) {
     node.doForAll((data) => {
         console.log(data.id);
         this.guideArray.push(data.id);
     });
     console.log(this.guideArray);
  }

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:2)

您遇到的问题是调用该方法后console.log不知道最新的数组状态。那是因为doForAll的实现使用的是Promise,它是异步的。因此console.log命令不会记录最新状态。

您可以使用以下所有节点创建BehaviorSubject

getChildren(node: TreeNode) {
     let nodeIds$ = new BehaviorSubject([]);
     node.doForAll((data) => {
         nodeIds$.next(nodeIds$.getValue().concat(data.id));
     });
     return nodeIds$;
}

请参阅:implementation of doForAll

答案 1 :(得分:0)

对于仍在寻找在父节点下的各个级别同步获取子IDS的任何其他人,您可以使用以下函数来一次同步获取所有数据:

getAllChildrenIDs(node: TreeNode) {
 let arraywithIDs: number[] = [];
 if (node.hasChildren) {
  node.children.forEach((node1: TreeNode) => {
    arraywithIDs.push(node1.id);
    console.log('child level: ', node1.level);
    console.log(node1);
    arraywithIDs = arraywithIDs.concat(this.getAllChildrenIDs(node1));
   });
 }
 return arraywithIDs;
}