Skip to content

fix(forms): improve select performance #61949

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

atscott
Copy link
Contributor

@atscott atscott commented Jun 6, 2025

We defer the update until after rendering
is complete for two reasons: first, to avoid repeatedly calling writeValue on every option element until we find the selected one (could be the very last element). Second, to ensure that we perform the write after the DOM elements have been created (this doesn't happen until the end of change detection when animations are enabled).

This is needed to efficiently set the select value when adding/removing options. The previous approach resulted in exponentially more _compareValue calls than the number of option elements (issue #41330).

Finally, this PR fixes an issue with delayed element removal when using the animations module (in all browsers). Previously when a selected option was removed (so no option matched the ngModel anymore), Angular changed the select element value before actually removing the option from the DOM. Then when the option was finally removed from the DOM, the browser would change the select value to that of the first option, even though it didn't match the ngModel (issue #18430). Note that this is still somewhat of an application problem when using ngModel. The model value still needs to be updated to a valid value when the selected value is deleted or it will be out of sync with the DOM.

Fixes #41330, fixes #18430.

TGP
requires an update to the screenshots in one test, with minor shifting in the placement of the text in the select control (see cl/767187673)

Though there is a green TGP, this changes the timing of values being written to the DOM, which still caries some risk. We should merge to main only to give more time for things to be discovered internally prior to external release.

@ngbot ngbot bot added this to the Backlog milestone Jun 6, 2025
@atscott atscott force-pushed the pr-takeover-23784 branch 2 times, most recently from 7d1a59b to 3f81874 Compare June 6, 2025 20:12
@atscott atscott added the target: minor This PR is targeted for the next minor release label Jun 6, 2025
We defer the update until after rendering
is complete for two reasons: first, to avoid repeatedly calling
`writeValue` on every option element until we find the selected one
(could be the very last element). Second, to ensure that we perform the
write after the DOM elements have been created (this doesn't happen
until the end of change detection when animations are enabled).

This is needed to efficiently set the select value when adding/removing options. The
previous approach resulted in exponentially more `_compareValue` calls than the number
of option elements (issue angular#41330).

Finally, this PR fixes an issue with delayed element removal when using the animations
module (in all browsers). Previously when a selected option was removed (so no option
matched the ngModel anymore), Angular changed the select element value before actually
removing the option from the DOM. Then when the option was finally removed from the DOM,
the browser would change the select value to that of the first option, even though it
didn't match the ngModel (issue angular#18430). Note that this is still
somewhat of an application problem when using `ngModel`. The model value
still needs to be updated to a valid value when the selected value is
deleted or it will be out of sync with the DOM.

Fixes angular#41330, fixes angular#18430.
@atscott atscott force-pushed the pr-takeover-23784 branch from 3f81874 to cd961cb Compare June 6, 2025 22:06
@atscott atscott force-pushed the pr-takeover-23784 branch from 3b278f1 to fb7134d Compare June 6, 2025 22:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area: forms target: minor This PR is targeted for the next minor release
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Select dropdowns with ngValue binding perform far worse than expected BrowserAnimationsModule changes the behaviour of select-dropdowns
2 participants
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy