angular / angular/components

bug(CdkTable): Table rows are re-rendered twice when columns change

Aperta
#25,307 1 commento 1 reazione 0 assegnatari Vedi su GitHub
area: cdk/table P4 perf
Lingua principale
TypeScript
Stelle
25k
Fork
6.8k
Merge medio
1g 8h
PR unite (30g)
91

Descrizione

### 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

A component with a MatTable has two `*matRowDef` directives, one with a `when` clause and a default one. When changing the list of columns after the initial render all rows will be recreated and correctly updated.

However, on the next change detection cycle the rows will be re-rendered again even if nothing has changed.

### Reproduction

Steps to reproduce:
1. The MatTable has a default matRowDef and a matRowDef with a "when" clause
2. Enter a value into the first input (which will only be stored in the DOM, no ngModel)
3. Click the button to update the columns array
4. All rows will be re-renderd and your input will be lost (that's okay)
5. Again, enter a new value into the first input
6. Click the button that just calls an empty function that does nothing - but Angular will trigger change detection after the event
7. Even if nothing has changed, all rows will be re-rendered and your input will be lost - that's not okay
8. Again, enter a new value into the first input
9. Click the button again
10. No re-rendering, your input value is still there

https://stackblitz.com/edit/components-issue-2dlnew?file=src/app/example-component.ts

### Expected Behavior

The rows should be re-rendered once, after the columns array has changed.

### Actual Behavior

The rows are re-rendered twice, once after the columns array has changed and a second time on the next change detection cycle.

### Environment

The Stackblitz repro uses v13 (provided by the issue template) but it can be reproduced with the latest version too.

```
Angular CLI: 14.0.6
Node: 16.13.0
Package Manager: npm 8.1.0
OS: darwin arm64

Angular: 14.0.6
... animations, cli, common, compiler, compiler-cli, core, forms
... platform-browser, platform-browser-dynamic, router

Package Version
---------------------------------------------------------
@angular-devkit/architect 0.1400.6
@angular-devkit/build-angular 14.0.6
@angular-devkit/core 14.0.6
@angular-devkit/schematics 14.0.6
@angular/cdk 14.0.5
@angular/material 14.0.5
@schematics/angular 14.0.6
rxjs 7.5.6
typescript 4.7.4
```

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

Inizia dalla riproduzione StackBlitz collegata in src/app/example-component.ts e riproduci il rendering della riga aggiuntiva con due direttive matRowDef, una delle quali usa una clausola when. Confronta il rendering dopo la modifica dell'array columns con il successivo ciclo di rilevamento delle modifiche con una funzione vuota; il lavoro è completato quando le righe vengono renderizzate una sola volta dopo la modifica di columns e mantengono i valori di input nel ciclo successivo.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
angular, typescript
Ambito
frontend
Tipo di issue
Bug
Difficoltà
3/5
Tempo stimato
1-2 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
42/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.