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(core): make ActivatedRoute inject correct instance inside @defer blocks #55374

Closed
wants to merge 1 commit into from

Conversation

AndrewKushnir
Copy link
Contributor

RouterOutlet uses a unique injector logic that returns a value that correspond to the ActivatedRoute token dynamically. This logic breaks when a component/directive/pipe that injects the ActivatedRoute is located within a @defer block, because defer creates an EnvironmentInjector instance, which doesn't have that dynamic logic.

We've added some special handling of the OutletInjector in one of the previous commits, but it was incomplete and it was not covering cases when different routes use the same component. This commit updates defer logic to re-establish this dynamic behavior for ActivatedRoute by creating an instance of the OutletInjector when a parent injector was also an instance of OutletInjector.

This fix is a short-term solution and longer term we should find a way to achieve the dynamic behavior that Router relies on, but without adding a special case logic into defer.

Resolves #54864.

PR Type

What kind of change does this PR introduce?

  • Bugfix

Does this PR introduce a breaking change?

  • Yes
  • No

@AndrewKushnir AndrewKushnir added action: review The PR is still awaiting reviews from at least one requested reviewer area: core Issues related to the framework runtime target: patch This PR is targeted for the next patch release core: defer Issues related to @defer blocks. labels Apr 17, 2024
@ngbot ngbot bot modified the milestone: Backlog Apr 17, 2024
@AndrewKushnir AndrewKushnir marked this pull request as draft April 17, 2024 00:23
@AndrewKushnir AndrewKushnir force-pushed the defer_fix_54864 branch 2 times, most recently from 443a0e6 to da29094 Compare April 17, 2024 01:06
@AndrewKushnir AndrewKushnir marked this pull request as ready for review April 17, 2024 01:07
@AndrewKushnir
Copy link
Contributor Author

Exploratory presubmit.

…er` blocks

`RouterOutlet` uses a unique injector logic that returns a value that correspond to the `ActivatedRoute` token dynamically. This logic breaks when a component/directive/pipe that injects the `ActivatedRoute` is located within a `@defer` block, because defer creates an `EnvironmentInjector` instance, which doesn't have that dynamic logic.

We've added some special handling of the `OutletInjector` in one of the previous commits, but it was incomplete and it was not covering cases when different routes use the same component. This commit updates defer logic to re-establish this dynamic behavior for `ActivatedRoute` by creating an instance of the `OutletInjector` when a parent injector was also an instance of `OutletInjector`.

This fix is a short-term solution and longer term we should find a way to achieve the dynamic behavior that Router relies on, but without adding a special case logic into defer.

Resolves angular#54864.
@AndrewKushnir AndrewKushnir added action: merge The PR is ready for merge by the caretaker merge: caretaker note Alert the caretaker performing the merge to check the PR for an out of normal action needed or note and removed action: review The PR is still awaiting reviews from at least one requested reviewer labels Apr 17, 2024
@AndrewKushnir
Copy link
Contributor Author

Caretaker note: presubmit is "green", this PR is ready for merge.

@alxhub
Copy link
Member

alxhub commented Apr 22, 2024

This PR was merged into the repository by commit 9894278.

@alxhub alxhub closed this in 9894278 Apr 22, 2024
alxhub pushed a commit that referenced this pull request Apr 22, 2024
…er` blocks (#55374)

`RouterOutlet` uses a unique injector logic that returns a value that correspond to the `ActivatedRoute` token dynamically. This logic breaks when a component/directive/pipe that injects the `ActivatedRoute` is located within a `@defer` block, because defer creates an `EnvironmentInjector` instance, which doesn't have that dynamic logic.

We've added some special handling of the `OutletInjector` in one of the previous commits, but it was incomplete and it was not covering cases when different routes use the same component. This commit updates defer logic to re-establish this dynamic behavior for `ActivatedRoute` by creating an instance of the `OutletInjector` when a parent injector was also an instance of `OutletInjector`.

This fix is a short-term solution and longer term we should find a way to achieve the dynamic behavior that Router relies on, but without adding a special case logic into defer.

Resolves #54864.

PR Close #55374
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
action: merge The PR is ready for merge by the caretaker area: core Issues related to the framework runtime core: defer Issues related to @defer blocks. merge: caretaker note Alert the caretaker performing the merge to check the PR for an out of normal action needed or note target: patch This PR is targeted for the next patch release
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Router links in @defer blocks not having correct relative route
3 participants