fix(item): allow nested content to be conditionally interactive #30519
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Issue number: resolves #29763
What is the current behavior?
If the nested content of an ion-item is conditionally rendered and goes from containing zero interactive elements to one or more, a render is not triggered in Angular and the item does not behave correctly for one or more nested inputs.
What is the new behavior?
connectedCallback()
to watch for changes in item's child list. When thechildList
changes, two pieces of state that track whether the item needs to be interactive and whether there are multiple interactive elements are updated.disconnectedCallback()
and logic to disconnect Mutation Observer.totalNestedInputs()
with logic from existingsetMultipleInputs
function to be used for bothsetMultipleInputs
and new functionsetIsInteractive
.Does this introduce a breaking change?
Other information
I opted for the MutationObserver over a
slotchange
listener because theslotchange
fires synchronously on any slot within the shadowRoot, and the MutationObserver fires once on the item element itself. I attempted to add the minimum amount of logic to achieve this but there may be a more elegant solution that combines whatmultipleInputs
andisInteractive
are doing but requires more changes to existing code.