Only add event listeners when a block is first mounted #4860
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.
This is an alternative to #4781, and fixes #4693. Rather than passing down a
#remount
variable that indicates whether a block is being remounted rather than mounted (due to a keyed each reordering), it allows blocks that contain event listeners (due to theon:
,bind:
oruse:
directives) to maintain their own#mounted
state, and to add or ignore those listeners as appropriate.(Initially I tried to reuse
#current
, but that's a little tricky — it becomes false when a block is outroing but still mounted, which means that an interrupted outro transition would result in listeners being reapplied, i.e. a memory leak, albeit less severe than the current situation.)It does result in more code for those blocks. My gut says it's still a win compared to passing
#remount
around everywhere (certain in terms of the compiler source code), but I'm open to persuasion (or science) to the contrary.