@@ -94,10 +94,10 @@ export class CdkTree<T, K = T> implements AfterContentChecked, CollectionViewer,
9494 private _dataSubscription : Subscription | null ;
9595
9696 /** Level of nodes */
97- private _levels : Map < T , number > = new Map < T , number > ( ) ;
97+ private _levels : Map < K , number > = new Map < K , number > ( ) ;
9898
9999 /** The immediate parents for a node. This is `null` if there is no parent. */
100- private _parents : Map < T , T | null > = new Map < T , T | null > ( ) ;
100+ private _parents : Map < K , T | null > = new Map < K , T | null > ( ) ;
101101
102102 /**
103103 * The internal node groupings for each node; we use this, primarily for flattened trees, to
@@ -210,9 +210,6 @@ export class CdkTree<T, K = T> implements AfterContentChecked, CollectionViewer,
210210 new Map < K , CdkTreeNode < T , K > > ( ) ,
211211 ) ;
212212
213- /** The mapping between data nodes and the parent node. `null` if no parent. */
214- private _parents : Map < K , T | null > = new Map < K , T | null > ( ) ;
215-
216213 constructor ( private _differs : IterableDiffers , private _changeDetectorRef : ChangeDetectorRef ) { }
217214
218215 ngOnInit ( ) {
@@ -343,8 +340,8 @@ export class CdkTree<T, K = T> implements AfterContentChecked, CollectionViewer,
343340 } else if ( currentIndex == null ) {
344341 viewContainer . remove ( adjustedPreviousIndex ! ) ;
345342 const group = this . _getNodeGroup ( item . item ) ;
346- this . _levels . delete ( item . item ) ;
347- this . _parents . delete ( item . item ) ;
343+ this . _levels . delete ( this . _getExpansionKey ( item . item ) ) ;
344+ this . _parents . delete ( this . _getExpansionKey ( item . item ) ) ;
348345 group . splice ( group . indexOf ( item . item ) , 1 ) ;
349346 } else {
350347 const view = viewContainer . get ( adjustedPreviousIndex ! ) ;
@@ -393,21 +390,24 @@ export class CdkTree<T, K = T> implements AfterContentChecked, CollectionViewer,
393390 const levelAccessor = this . _getLevelAccessor ( ) ;
394391 if ( levelAccessor ) {
395392 context . level = levelAccessor ( nodeData ) ;
396- } else if ( typeof parentData !== 'undefined' && this . _levels . has ( parentData ) ) {
397- context . level = this . _levels . get ( parentData ) ! + 1 ;
393+ } else if (
394+ typeof parentData !== 'undefined' &&
395+ this . _levels . has ( this . _getExpansionKey ( parentData ) )
396+ ) {
397+ context . level = this . _levels . get ( this . _getExpansionKey ( parentData ) ) ! + 1 ;
398398 } else {
399399 context . level = 0 ;
400400 }
401- this . _levels . set ( nodeData , context . level ) ;
401+ this . _levels . set ( this . _getExpansionKey ( nodeData ) , context . level ) ;
402402 const parent = parentData ?? this . _findParentForNode ( nodeData , index ) ;
403- this . _parents . set ( nodeData , parent ) ;
403+ this . _parents . set ( this . _getExpansionKey ( nodeData ) , parent ) ;
404404
405405 // Determine where to insert this new node into the group, then insert it.
406406 // We do this by looking at the previous node in our flattened node list. If it's in the same
407407 // group, we place the current node after. Otherwise, we place it at the start of the group.
408408 const currentGroup = this . _groups . get ( context . level ) ?? new Map < T | null , T [ ] > ( ) ;
409409 const group = currentGroup . get ( parent ) ?? [ ] ;
410- const previousNode = this . _dataNodes ?. [ index - 1 ] ;
410+ const previousNode = this . _dataNodes . value ?. [ index - 1 ] ;
411411 const groupInsertionIndex = ( previousNode && group . indexOf ( previousNode ) + 1 ) ?? 0 ;
412412 group . splice ( groupInsertionIndex , 0 , nodeData ) ;
413413 currentGroup . set ( parent , group ) ;
@@ -616,8 +616,13 @@ export class CdkTree<T, K = T> implements AfterContentChecked, CollectionViewer,
616616 this . _nodes . next ( this . _nodes . value ) ;
617617 }
618618
619+ /**
620+ * For the given node, determine the level where this node appears in the tree.
621+ *
622+ * This is intended to be used for `aria-level` but is 0-indexed.
623+ */
619624 _getLevel ( node : T ) {
620- return this . _levels . get ( node ) ;
625+ return this . _levels . get ( this . _getExpansionKey ( node ) ) ;
621626 }
622627
623628 /**
@@ -764,8 +769,8 @@ export class CdkTree<T, K = T> implements AfterContentChecked, CollectionViewer,
764769 }
765770
766771 private _getNodeGroup ( node : T ) {
767- const level = this . _levels . get ( node ) ;
768- const parent = this . _parents . get ( node ) ;
772+ const level = this . _levels . get ( this . _getExpansionKey ( node ) ) ;
773+ const parent = this . _parents . get ( this . _getExpansionKey ( node ) ) ;
769774 const group = this . _groups . get ( level ?? 0 ) ?. get ( parent ?? null ) ;
770775 return group ?? [ node ] ;
771776 }
@@ -777,10 +782,10 @@ export class CdkTree<T, K = T> implements AfterContentChecked, CollectionViewer,
777782 if ( ! this . _dataNodes ) {
778783 return null ;
779784 }
780- const currentLevel = this . _levels . get ( node ) ?? 0 ;
785+ const currentLevel = this . _levels . get ( this . _getExpansionKey ( node ) ) ?? 0 ;
781786 for ( let parentIndex = index ; parentIndex >= 0 ; parentIndex -- ) {
782- const parentNode = this . _dataNodes [ parentIndex ] ;
783- const parentLevel = this . _levels . get ( parentNode ) ?? 0 ;
787+ const parentNode = this . _dataNodes . value [ parentIndex ] ;
788+ const parentLevel = this . _levels . get ( this . _getExpansionKey ( parentNode ) ) ?? 0 ;
784789
785790 if ( parentLevel < currentLevel ) {
786791 return parentNode ;
0 commit comments