Skip to content
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

fix(focus-monitor): implement OnDestroy logic #9305

Merged
merged 1 commit into from
Jan 23, 2018

Conversation

crisbeto
Copy link
Member

@crisbeto crisbeto commented Jan 9, 2018

Similarly to most of the other DOM-related services, these changes implement ngOnDestroy for the FocusMonitor which removes the monitoring from all of the currently-monitored elements.

Similarly to most of the other DOM-related services, these changes implement `ngOnDestroy` for the `FocusMonitor` which removes the monitoring from all of the currently-monitored elements.
@googlebot googlebot added the cla: yes PR author has agreed to Google's Contributor License Agreement label Jan 9, 2018
/** Weak map of elements being monitored to their info. */
private _elementInfo = new WeakMap<Element, MonitoredElementInfo>();
/** Map of elements being monitored to their info. */
private _elementInfo = new Map<HTMLElement, MonitoredElementInfo>();
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note: I would prefer to keep this as a WeakMap, but we need a Map in order to be able to iterate over the elements. Alternatively, if we make an assumption that all the monitored elements will be removed on destroy, we could remove only the global listeners.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a tricky trade-off. We don't have any data to know for sure, but I expect most apps will end up with FocusMonitor provided at the root, meaning that using Map could end up making elements remain in memory after they'd otherwise be removed.

Do you think it would be common that monitored elements would remain while the module with the FocusMonitor would be unloaded?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe the most common case would be that the elements are removed while the monitor remains, in which case the responsibility for stopping the monitoring is on the consumer.

Regarding using the Map, I have a hunch (haven't verified it) that the current setup would retain references to the elements as well. While we use the element as a key, we also have a reference to it in the unlisten function which is inside the value. I think that this would retain the reference until the item is removed from the map.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're right, the unlisten would preserve the element reference already, so switching to a Map won't change anything

@mmalerba
Copy link
Contributor

Does ngOnDestroy get automatically called for Injectables? I was under the impression it didn't and that the lifecycle methods only applied to Components and Directives.

@jelbourn
Copy link
Member

jelbourn commented Jan 10, 2018

@mmalerba it gets called if the module is unloaded, which very large apps (like GCP) do.

Copy link
Member

@jelbourn jelbourn left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@jelbourn jelbourn added pr: lgtm action: merge The PR is ready for merge by the caretaker and removed pr: needs review labels Jan 10, 2018
@crisbeto crisbeto added the target: patch This PR is targeted for the next patch release label Jan 10, 2018
@jelbourn jelbourn merged commit 8972bf4 into angular:master Jan 23, 2018
jelbourn pushed a commit to jelbourn/components that referenced this pull request Jan 29, 2018
Similarly to most of the other DOM-related services, these changes implement `ngOnDestroy` for the `FocusMonitor` which removes the monitoring from all of the currently-monitored elements.
@angular-automatic-lock-bot
Copy link

This issue has been automatically locked due to inactivity.
Please file a new issue if you are encountering a similar or related problem.

Read more about our automatic conversation locking policy.

This action has been performed automatically by a bot.

@angular-automatic-lock-bot angular-automatic-lock-bot bot locked and limited conversation to collaborators Sep 8, 2019
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
action: merge The PR is ready for merge by the caretaker cla: yes PR author has agreed to Google's Contributor License Agreement target: patch This PR is targeted for the next patch release
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants