diff --git a/src/material/tree/data-source/flat-data-source.ts b/src/material/tree/data-source/flat-data-source.ts index c766adf87c2e..47e1ee346843 100644 --- a/src/material/tree/data-source/flat-data-source.ts +++ b/src/material/tree/data-source/flat-data-source.ts @@ -127,32 +127,34 @@ export class MatTreeFlattener { * to type `F` for `MatTree` to consume. */ export class MatTreeFlatDataSource extends DataSource { - readonly _flattenedData = new BehaviorSubject([]); + private readonly _flattenedData = new BehaviorSubject([]); + private readonly _expandedData = new BehaviorSubject([]); - readonly _expandedData = new BehaviorSubject([]); - - readonly _data: BehaviorSubject; get data() { return this._data.value; } set data(value: T[]) { this._data.next(value); this._flattenedData.next(this._treeFlattener.flattenNodes(this.data)); this._treeControl.dataNodes = this._flattenedData.value; } + private readonly _data = new BehaviorSubject([]); constructor(private _treeControl: FlatTreeControl, private _treeFlattener: MatTreeFlattener, - initialData: T[] = []) { + initialData?: T[]) { super(); - this._data = new BehaviorSubject(initialData); + + if (initialData) { + // Assign the data through the constructor to ensure that all of the logic is executed. + this.data = initialData; + } } connect(collectionViewer: CollectionViewer): Observable { - const changes = [ + return merge( collectionViewer.viewChange, this._treeControl.expansionModel.changed, this._flattenedData - ]; - return merge(...changes).pipe(map(() => { + ).pipe(map(() => { this._expandedData.next( this._treeFlattener.expandFlattenedNodes(this._flattenedData.value, this._treeControl)); return this._expandedData.value; diff --git a/src/material/tree/data-source/nested-data-source.ts b/src/material/tree/data-source/nested-data-source.ts index 85a17e6608d0..3a4e89d67799 100644 --- a/src/material/tree/data-source/nested-data-source.ts +++ b/src/material/tree/data-source/nested-data-source.ts @@ -18,13 +18,12 @@ import {map} from 'rxjs/operators'; * or collapse. The expansion/collapsion will be handled by TreeControl and each non-leaf node. */ export class MatTreeNestedDataSource extends DataSource { - readonly _data = new BehaviorSubject([]); - /** * Data for the nested tree */ get data() { return this._data.value; } set data(value: T[]) { this._data.next(value); } + private readonly _data = new BehaviorSubject([]); connect(collectionViewer: CollectionViewer): Observable { return merge(...[collectionViewer.viewChange, this._data]) diff --git a/src/material/tree/tree.spec.ts b/src/material/tree/tree.spec.ts index 17d56a1d7129..1fdb4d814f09 100644 --- a/src/material/tree/tree.spec.ts +++ b/src/material/tree/tree.spec.ts @@ -785,10 +785,6 @@ class MatTreeWithNullOrUndefinedChild { dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener, TREE_DATA); - constructor() { - this.dataSource.data = TREE_DATA; - } - hasChild = (_: number, node: ExampleFlatNode) => node.expandable; } diff --git a/tools/public_api_guard/material/tree.d.ts b/tools/public_api_guard/material/tree.d.ts index 0436f8cc00ab..5f3229827ddd 100644 --- a/tools/public_api_guard/material/tree.d.ts +++ b/tools/public_api_guard/material/tree.d.ts @@ -24,9 +24,6 @@ export declare class MatTree extends CdkTree { } export declare class MatTreeFlatDataSource extends DataSource { - readonly _data: BehaviorSubject; - readonly _expandedData: BehaviorSubject; - readonly _flattenedData: BehaviorSubject; get data(): T[]; set data(value: T[]); constructor(_treeControl: FlatTreeControl, _treeFlattener: MatTreeFlattener, initialData?: T[]); @@ -53,7 +50,6 @@ export declare class MatTreeModule { } export declare class MatTreeNestedDataSource extends DataSource { - readonly _data: BehaviorSubject; get data(): T[]; set data(value: T[]); connect(collectionViewer: CollectionViewer): Observable;