angular / angular/components

bug(mat-selection-list): mat-list-option deselecting itself when recreated in virtual-scroll-viewport

Abierto
#29,426 2 comentarios 0 reacciones 0 asignados Ver en GitHub
area: material/list P4
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

I have a wrapper component for the `mat-selection-list` to support generic filtering. Also I have a master checkbox to select everything in the current filter scope. To support large datasets I also have an option for `virtual scrolling`.

Since I allow filtering, the source set of the list is constantly changing which clears the selection if an option is filtered out. To prevent this, I use the angular `SelectionModel` and the callbacks of the mat-list-options. But here is the problem:

Since the options are destroyed and recreated while scrolling through the viewport, the `selectedChange` event of the option is triggered with the initial unselected state of an option, so an option deselects itself when being recreated. But since this does not happen all the time, it seems there is a race between `(selectedChange)` and `[selected]`.

### Reproduction

StackBlitz link: https://stackblitz.com/edit/stackblitz-starters-iidbcx
Steps to reproduce:
1. Trigger the master check-box
2. scroll
3. see the master changes to indeterminate since check-boxes deselect themself

### Expected Behavior

I would expect that the inital `selected = false` when creating the component is not emitted as an event

### Actual Behavior

Inital `selected = false` when creating the component is emitted as an event and selected itself. But not always --> race

### Environment

Angular CLI: 18.0.7
Node: 18.20.3
Package Manager: npm 10.2.3
OS: linux x64

Angular: 18.0.6
... animations, cdk, cdk-experimental, common, compiler
... compiler-cli, core, forms, material, platform-browser
... platform-browser-dynamic, router

Package Version
---------------------------------------------------------
@angular-devkit/architect 0.1800.7
@angular-devkit/build-angular 18.0.7
@angular-devkit/core 18.0.7
@angular-devkit/schematics 18.0.7
@angular/cli 18.0.7
@schematics/angular 18.0.7
rxjs 7.8.1
typescript 5.4.5
zone.js 0.14.7

Guía de contribución

Abrir la guía de contribución

Línea de trabajo

Comienza con la reproducción de StackBlitz e inspecciona la interacción entre mat-selection-list, mat-list-option y virtual-scroll-viewport al desplazarte después de seleccionar todos los elementos. Verifica que recrear una opción no emita un evento selectedChange inicial con false y que la selección maestra permanezca estable después de filtrar y desplazarte.

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
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
35/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.