我正在使用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);
}
答案 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$;
}
答案 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;
}