bug(CdkTable): Table rows are re-rendered twice when columns change
- Lenguaje dominante
- TypeScript
- Estrellas
- 25k
- Forks
- 6.8k
- Merge medio
- 1 d 8 h
- PR fusionados (30 d)
- 91
Descripción
### 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
```
Guía de contribución
Línea de trabajo
Comienza con la reproducción enlazada de StackBlitz en src/app/example-component.ts y reproduce el renderizado de la fila adicional con dos directivas matRowDef, una de ellas usando una cláusula when. Compara el renderizado después de cambiar el array columns con el siguiente ciclo de detección de cambios con una función vacía; estará terminado cuando las filas se rendericen una sola vez después del cambio de columns y conserven los valores de entrada en el ciclo siguiente.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- angular, typescript
- Área
- frontend
- Tipo de issue
- Error
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 42/100