angular / angular/components

bug(cdk/table): CdkTable does not handle column updates correctly when using recycleRows

Open
#32,253 2 comments 1 reaction 0 assignees View on GitHub
area: cdk/table P3
Dominant language
TypeScript
Stars
25k
Forks
6.8k
Avg merge
1d 8h
Merged PRs (30d)
91

Description

### Is this a regression?

- [ ] Yes, this behavior used to work in the previous version

### The previous version in which this bug was not present was

_No response_

### Description

When using `CdkTable` with the table `recycleRows` directive it doesn't look like the table doesn't re-render cached rows not currently in the DOM. This leads to a situation where if those cached rows are later re-used the cells in the row don't match the columns.

It seems like this may be just a matter of clearing the row cache in `_forceRenderDataRows`. This assumes the row elements can't be re-used at all, but that seems to be the current behavior of `_forceRenderDataRows` to re-render everything. It looks like this could be achieved by calling `detach` on the `_RecycleViewRepeaterStrategy` instance in `_forceRenderDataRows`, but it's unclear the semantics of that method since it's not documented in `_ViewRepeater`. `CdkVirtualForOf` only calls it in `ngOnDestroy` and **`CdkTable` never calls it** (probably a separate bug where these row views get leaked when the table gets destroyed).

### Reproduction

StackBlitz link: https://stackblitz.com/edit/mssn6jgh?file=src%2Fexample%2Fcdk-table-recycle-rows-example.ts
Steps to reproduce:
1. Click `Set Short List` to reduce the number of rows to 15 (caching the 10 removed rows).
2. Then click `Toggle Columns`. This forces a full re-render through `_forceRenderDataRows` (which doesn't populate the cache when removing).

### Expected Behavior

All 15 rows re-render correctly

### Actual Behavior

When the 15 rows are re-rendered 5 have the old list of 3 columns since they were inserted from the cache and the remaining 10 are new rows and render correctly.

### Environment

- Angular: 20.2.4
- CDK/Material: 20.2.4
- Browser(s): 141.0.7390.126
- Operating System (e.g. Windows, macOS, Ubuntu): ChromeOS

Contributor guide

Open the contributing guide

Research direction

Reproduce the issue with the StackBlitz example in src/example/cdk-table-recycle-rows-example.ts, then inspect CdkTable._forceRenderDataRows and the _RecycleViewRepeaterStrategy detach behavior. Confirm that toggling columns after reducing the list renders all 15 rows with matching columns, including rows reused from the cache.

Written by the indexing model from the issue text.

Assessment

Tech stack
angular, typescript
Domain
frontend
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
52/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.