Skip to content

fix(core): make ActivatedRoute inject correct instance inside @defer blocks#55374

Closed
AndrewKushnir wants to merge 1 commit intoangular:mainfrom
AndrewKushnir:defer_fix_54864
Closed

fix(core): make ActivatedRoute inject correct instance inside @defer blocks#55374
AndrewKushnir wants to merge 1 commit intoangular:mainfrom
AndrewKushnir:defer_fix_54864

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
@AndrewKushnir AndrewKushnir requested a review from atscott April 17, 2024 00:19
@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
@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 May 23, 2024
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 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