@@ -716,10 +716,7 @@ export class CdkTree<T, K = T>
716
716
if ( this . treeControl ) {
717
717
this . treeControl . expandAll ( ) ;
718
718
} else if ( this . _expansionModel ) {
719
- const expansionModel = this . _expansionModel ;
720
- expansionModel . select (
721
- ...this . _flattenedNodes . value . map ( child => this . _getExpansionKey ( child ) ) ,
722
- ) ;
719
+ this . _forEachExpansionKey ( keys => this . _expansionModel ?. select ( ...keys ) ) ;
723
720
}
724
721
}
725
722
@@ -728,10 +725,7 @@ export class CdkTree<T, K = T>
728
725
if ( this . treeControl ) {
729
726
this . treeControl . collapseAll ( ) ;
730
727
} else if ( this . _expansionModel ) {
731
- const expansionModel = this . _expansionModel ;
732
- expansionModel . deselect (
733
- ...this . _flattenedNodes . value . map ( child => this . _getExpansionKey ( child ) ) ,
734
- ) ;
728
+ this . _forEachExpansionKey ( keys => this . _expansionModel ?. deselect ( ...keys ) ) ;
735
729
}
736
730
}
737
731
@@ -776,13 +770,7 @@ export class CdkTree<T, K = T>
776
770
if ( ! expanded ) {
777
771
return [ ] ;
778
772
}
779
- return this . _findChildrenByLevel (
780
- levelAccessor ,
781
- flattenedNodes ,
782
-
783
- dataNode ,
784
- 1 ,
785
- ) ;
773
+ return this . _findChildrenByLevel ( levelAccessor , flattenedNodes , dataNode , 1 ) ;
786
774
} ) ,
787
775
) ;
788
776
}
@@ -1153,6 +1141,28 @@ export class CdkTree<T, K = T>
1153
1141
this . _ariaSets . set ( parentKey , group ) ;
1154
1142
}
1155
1143
}
1144
+
1145
+ /** Invokes a callback with all node expansion keys. */
1146
+ private _forEachExpansionKey ( callback : ( keys : K [ ] ) => void ) {
1147
+ const toToggle : K [ ] = [ ] ;
1148
+ const observables : Observable < T [ ] > [ ] = [ ] ;
1149
+
1150
+ this . _nodes . value . forEach ( node => {
1151
+ toToggle . push ( this . _getExpansionKey ( node . data ) ) ;
1152
+ observables . push ( this . _getDescendants ( node . data ) ) ;
1153
+ } ) ;
1154
+
1155
+ if ( observables . length > 0 ) {
1156
+ combineLatest ( observables )
1157
+ . pipe ( take ( 1 ) , takeUntil ( this . _onDestroy ) )
1158
+ . subscribe ( results => {
1159
+ results . forEach ( inner => inner . forEach ( r => toToggle . push ( this . _getExpansionKey ( r ) ) ) ) ;
1160
+ callback ( toToggle ) ;
1161
+ } ) ;
1162
+ } else {
1163
+ callback ( toToggle ) ;
1164
+ }
1165
+ }
1156
1166
}
1157
1167
1158
1168
/**
0 commit comments