77 */
88
99import {
10- Directive ,
11- ElementRef ,
10+ afterNextRender ,
1211 afterRenderEffect ,
1312 booleanAttribute ,
1413 computed ,
14+ Directive ,
15+ ElementRef ,
1516 inject ,
1617 input ,
1718 model ,
1819 numberAttribute ,
20+ OnDestroy ,
1921 signal ,
2022 Signal ,
2123 untracked ,
2224} from '@angular/core' ;
2325import { _IdGenerator } from '@angular/cdk/a11y' ;
2426import { Directionality } from '@angular/cdk/bidi' ;
25- import { ComboboxTreePattern , TreeItemPattern , TreePattern , sortDirectives } from '../private' ;
27+ import { ComboboxTreePattern , TreeItemPattern , TreePattern , SortedCollection } from '../private' ;
2628import { ComboboxPopup } from '../combobox' ;
2729import type { TreeItem } from './tree-item' ;
2830
@@ -79,7 +81,7 @@ import type {TreeItem} from './tree-item';
7981 } ,
8082 hostDirectives : [ ComboboxPopup ] ,
8183} )
82- export class Tree < V > {
84+ export class Tree < V > implements OnDestroy {
8385 /** A reference to the host element. */
8486 private readonly _elementRef = inject ( ElementRef ) ;
8587
@@ -91,8 +93,8 @@ export class Tree<V> {
9193 optional : true ,
9294 } ) ;
9395
94- /** All TreeItem instances within this tree. */
95- private readonly _unorderedItems = signal ( new Set < TreeItem < V > > ( ) ) ;
96+ /** The collection of tree items . */
97+ readonly _collection = new SortedCollection < TreeItem < V > > ( ) ;
9698
9799 /** A unique identifier for the tree. */
98100 readonly id = input ( inject ( _IdGenerator ) . getId ( 'ng-tree-' , true ) ) ;
@@ -165,9 +167,7 @@ export class Tree<V> {
165167 const inputs = {
166168 ...this ,
167169 id : this . id ,
168- items : computed ( ( ) =>
169- [ ...this . _unorderedItems ( ) ] . sort ( sortDirectives ) . map ( item => item . _pattern ) ,
170- ) ,
170+ items : computed ( ( ) => this . _collection . orderedItems ( ) . map ( item => item . _pattern ) ) ,
171171 activeItem : signal < TreeItemPattern < V > | undefined > ( undefined ) ,
172172 combobox : ( ) => this . _popup ?. combobox ?. _pattern ,
173173 element : ( ) => this . element ,
@@ -179,11 +179,15 @@ export class Tree<V> {
179179
180180 this . activeDescendant = computed ( ( ) => this . _pattern . activeDescendant ( ) ) ;
181181
182+ afterNextRender ( ( ) => {
183+ this . _collection . startObserving ( this . element ) ;
184+ } ) ;
185+
182186 if ( this . _popup ?. combobox ) {
183187 this . _popup ?. _controls ?. set ( this . _pattern as ComboboxTreePattern < V > ) ;
184188 }
185189
186- // Check for any violationns after the DOM has been updated.
190+ // Check for any violations after the DOM has been updated.
187191 afterRenderEffect ( {
188192 read : ( ) => {
189193 if ( typeof ngDevMode === 'undefined' || ngDevMode ) {
@@ -223,14 +227,8 @@ export class Tree<V> {
223227 } ) ;
224228 }
225229
226- _register ( child : TreeItem < V > ) {
227- this . _unorderedItems ( ) . add ( child ) ;
228- this . _unorderedItems . set ( new Set ( this . _unorderedItems ( ) ) ) ;
229- }
230-
231- _unregister ( child : TreeItem < V > ) {
232- this . _unorderedItems ( ) . delete ( child ) ;
233- this . _unorderedItems . set ( new Set ( this . _unorderedItems ( ) ) ) ;
230+ ngOnDestroy ( ) {
231+ this . _collection . stopObserving ( ) ;
234232 }
235233
236234 scrollActiveItemIntoView ( options : ScrollIntoViewOptions = { block : 'nearest' } ) {
0 commit comments