2017-07-31 38 views
0

私はアプリケーションにツリービューを表示するためにAngular-Tree-Componentを使用しています。しかし、一度ノード上にいれば、そのノードの下にあるすべての子どもとその子どものリストを取得する必要があります。アングルツリーコンポーネントのすべての子供からIDを取得するにはどうすればいいですか?

私は彼らが私がでてるノードの下にすべてのノードのために呼び出され、そのドキュメント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

+0

がプッシュした直後に、最後にconsole.logを移動してみてください - ループ内で、それがその後、動作するかどうかを確認します..確かではありませんが、doForAll内の 'this'はコマンドが完了したときに 'this'と異なる場合があります。あなたの調査結果を教えてください!何らかのバインドコマンドが必要な場合があります。 – JGFMK

+0

@JGFMK配列にプッシュした後にconsole.logを移動すると、コンソール上でIDを押すことがわかりますが、配列[0]を展開するとすべての要素が表示されます – Ennio

+0

そのスクリーンショットを挿入できますか質問。おそらく、単に移動するのではなく、行を複製するだけです。最後にはconsole.log( "final:"、this.guideArray);を実行します。 – JGFMK

答えて

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

+0

はいいいよ。 – JGFMK

+0

私はこれを見ました。 – Ennio

+0

助けてくれてありがとうございます:) – Ennio

関連する問題