diff --git a/src/cdk/tree/tree.ts b/src/cdk/tree/tree.ts index 5a27c8bb479f..8a178e1e9885 100644 --- a/src/cdk/tree/tree.ts +++ b/src/cdk/tree/tree.ts @@ -1066,6 +1066,9 @@ export class CdkTree // nodes are flat, or if the tree is using a levelAccessor and the nodes are // nested. if (this.childrenAccessor && nodeType === 'flat') { + // clear previously generated data so we don't keep end up retaining data overtime causing + // memory leaks. + this._clearPreviousCache(); // This flattens children into a single array. this._ariaSets.set(null, [...nodes]); return this._flattenNestedNodesWithExpansion(nodes).pipe( @@ -1098,6 +1101,9 @@ export class CdkTree }), ); } else { + // clear previously generated data so we don't keep end up retaining data overtime causing + // memory leaks. + this._clearPreviousCache(); // For nested nodes, we still need to perform the node flattening in order // to maintain our caches for various tree operations. this._ariaSets.set(null, [...nodes]); @@ -1125,8 +1131,9 @@ export class CdkTree return; } - this._parents.clear(); - this._ariaSets.clear(); + // clear previously generated data so we don't keep end up retaining data overtime causing + // memory leaks. + this._clearPreviousCache(); for (let index = 0; index < flattenedNodes.length; index++) { const dataNode = flattenedNodes[index]; @@ -1163,6 +1170,13 @@ export class CdkTree callback(toToggle); } } + + /** Clears the maps we use to store parents, level & aria-sets in. */ + private _clearPreviousCache() { + this._parents.clear(); + this._levels.clear(); + this._ariaSets.clear(); + } } /**