-
Notifications
You must be signed in to change notification settings - Fork 6.8k
fix(cdk-experimental/listbox): initial listbox focus state #30764
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
base: main
Are you sure you want to change the base?
Conversation
wagnermaciel
commented
Apr 1, 2025
- The first option to receive focus in a listbox should be either the first selected option or the first option in the list if no option is selected.
* The first option to receive focus in a listbox should be either the first selected option or the first option in the list if no option is selected.
82798bd
to
c2019dc
Compare
constructor() { | ||
effect(() => { | ||
if (this._isViewInitialized() && !this._touched()) { | ||
const index = this.items().findIndex(i => this.value().includes(i.value())); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Feels weird to have these signal-reads knowing that it causes this effect to be run a lot. I guess it doesn't matter because of the initial conditional check, so its a fast function. But I wish there was a way for Angular to know this should really only be run based on the two conditional signals
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
100% agree. Having to have a signal for isViewInitialized
feels very janky. This was the only way I could get around Angular throwing an error because a required signal hasn't been set.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I mean the this.items()
, this.value()
, i.value()
- these will all trigger the effect right?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh, yes but those are needed to trigger the effect in order to figure out the correct start index. The effect should rerun any time those signals change until the listbox is touched (focused for the first time)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
But I wish there was a way for Angular to know this should really only be run based on the two conditional signals
I think you can wrap the rest of the reads in untracked(() => ...)
to indicate that (though it sounds like maybe you do need it to react to all of them here, just wanted to give an fyi that the feature exists)