Skip to content

fix(angular-query): do not run callbacks in injection context #8817

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

Merged

Conversation

arnoud-dv
Copy link
Collaborator

@arnoud-dv arnoud-dv commented Mar 16, 2025

As the callback functions of injectQuery and injectMutation were run in the injectionContext, using inject in these functions was possible. This is an anti-pattern in that it turns dependency injection into service locator. The Angular framework itself does not run callbacks in the injection context. Consider e.g. lifecycle hooks or callback functions on APIs such as effect or computed.

Running these callbacks in the injection context adds complexity to the adapter, and it wasn't consistent between callbacks, e.g. queryFn did not run in the injection context. Making it consistent by running other callbacks in the injection context too would require adding a lot more complexity.

To prevent the anti-pattern and to be consistent with the Angular framework and remove unnecessary complexity from the adapter the code changes in this PR will ensure callbacks are no longer run in the injection context.

@Component({
  // ..
})
export class SimpleExampleComponent {
  // ✅ inject on class contruction
+ private readonly http = inject(HttpClient)

  readonly query = injectQuery(() => {
    // ❌ injecting inside callback anti-pattern no longer possible
-   const http = inject(HttpClient)
    return {
      queryKey: ['repoData'],
      queryFn: () =>
        lastValueFrom(
-         http.get<Response>('https://api.github.com/repos/tanstack/query'),
+         this.http.get<Response>('https://api.github.com/repos/tanstack/query'),
        ),
    }
  })
}

Closes #8714

Copy link

nx-cloud bot commented Mar 16, 2025

View your CI Pipeline Execution ↗ for commit a0503de.

Command Status Duration Result
nx affected --targets=test:sherif,test:knip,tes... ✅ Succeeded 2m 44s View ↗
nx run-many --target=build --exclude=examples/*... ✅ Succeeded 2m View ↗

☁️ Nx Cloud last updated this comment at 2025-03-16 22:24:15 UTC

Copy link

pkg-pr-new bot commented Mar 16, 2025

Open in Stackblitz

More templates

@tanstack/angular-query-devtools-experimental

npm i https://pkg.pr.new/@tanstack/angular-query-devtools-experimental@8817

@tanstack/angular-query-experimental

npm i https://pkg.pr.new/@tanstack/angular-query-experimental@8817

@tanstack/eslint-plugin-query

npm i https://pkg.pr.new/@tanstack/eslint-plugin-query@8817

@tanstack/query-async-storage-persister

npm i https://pkg.pr.new/@tanstack/query-async-storage-persister@8817

@tanstack/query-broadcast-client-experimental

npm i https://pkg.pr.new/@tanstack/query-broadcast-client-experimental@8817

@tanstack/query-core

npm i https://pkg.pr.new/@tanstack/query-core@8817

@tanstack/query-devtools

npm i https://pkg.pr.new/@tanstack/query-devtools@8817

@tanstack/query-persist-client-core

npm i https://pkg.pr.new/@tanstack/query-persist-client-core@8817

@tanstack/query-sync-storage-persister

npm i https://pkg.pr.new/@tanstack/query-sync-storage-persister@8817

@tanstack/react-query

npm i https://pkg.pr.new/@tanstack/react-query@8817

@tanstack/react-query-devtools

npm i https://pkg.pr.new/@tanstack/react-query-devtools@8817

@tanstack/react-query-next-experimental

npm i https://pkg.pr.new/@tanstack/react-query-next-experimental@8817

@tanstack/react-query-persist-client

npm i https://pkg.pr.new/@tanstack/react-query-persist-client@8817

@tanstack/solid-query

npm i https://pkg.pr.new/@tanstack/solid-query@8817

@tanstack/solid-query-devtools

npm i https://pkg.pr.new/@tanstack/solid-query-devtools@8817

@tanstack/solid-query-persist-client

npm i https://pkg.pr.new/@tanstack/solid-query-persist-client@8817

@tanstack/svelte-query

npm i https://pkg.pr.new/@tanstack/svelte-query@8817

@tanstack/svelte-query-devtools

npm i https://pkg.pr.new/@tanstack/svelte-query-devtools@8817

@tanstack/svelte-query-persist-client

npm i https://pkg.pr.new/@tanstack/svelte-query-persist-client@8817

@tanstack/vue-query

npm i https://pkg.pr.new/@tanstack/vue-query@8817

@tanstack/vue-query-devtools

npm i https://pkg.pr.new/@tanstack/vue-query-devtools@8817

commit: a0503de

Copy link

codecov bot commented Mar 16, 2025

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 88.36%. Comparing base (796032d) to head (a0503de).
Report is 2 commits behind head on main.

Additional details and impacted files

Impacted file tree graph

@@             Coverage Diff             @@
##             main    #8817       +/-   ##
===========================================
+ Coverage   46.45%   88.36%   +41.91%     
===========================================
  Files         199       16      -183     
  Lines        7567      275     -7292     
  Branches     1740       44     -1696     
===========================================
- Hits         3515      243     -3272     
+ Misses       3672       31     -3641     
+ Partials      380        1      -379     
Components Coverage Δ
@tanstack/angular-query-devtools-experimental ∅ <ø> (∅)
@tanstack/angular-query-experimental 88.36% <100.00%> (-0.29%) ⬇️
@tanstack/eslint-plugin-query ∅ <ø> (∅)
@tanstack/query-async-storage-persister ∅ <ø> (∅)
@tanstack/query-broadcast-client-experimental ∅ <ø> (∅)
@tanstack/query-codemods ∅ <ø> (∅)
@tanstack/query-core ∅ <ø> (∅)
@tanstack/query-devtools ∅ <ø> (∅)
@tanstack/query-persist-client-core ∅ <ø> (∅)
@tanstack/query-sync-storage-persister ∅ <ø> (∅)
@tanstack/react-query ∅ <ø> (∅)
@tanstack/react-query-devtools ∅ <ø> (∅)
@tanstack/react-query-next-experimental ∅ <ø> (∅)
@tanstack/react-query-persist-client ∅ <ø> (∅)
@tanstack/solid-query ∅ <ø> (∅)
@tanstack/solid-query-devtools ∅ <ø> (∅)
@tanstack/solid-query-persist-client ∅ <ø> (∅)
@tanstack/svelte-query ∅ <ø> (∅)
@tanstack/svelte-query-devtools ∅ <ø> (∅)
@tanstack/svelte-query-persist-client ∅ <ø> (∅)
@tanstack/vue-query ∅ <ø> (∅)
@tanstack/vue-query-devtools ∅ <ø> (∅)
🚀 New features to boost your workflow:
  • Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@arnoud-dv arnoud-dv merged commit 7d3abb8 into TanStack:main Mar 17, 2025
6 of 7 checks passed
@arnoud-dv arnoud-dv deleted the fix/angular-callbacks-injection-context branch March 17, 2025 00:09
@k3nsei
Copy link

k3nsei commented Mar 24, 2025

@arnoud-dv This is not anty-pattern. It is normal angular code, where almost everything in Angular is based on DI. You can even pass injector to effect. So clearly you are wrong here!

https://angular.dev/api/core/CreateEffectOptions

🚨 Rollback this PR it is breaking our codebase.

If it were an anti-pattern, then https://angular.dev/api/core/runInInjectionContext would not exist.

You can even see how NgRx Signal Store is allowing for that https://ngrx.io/guide/signals/signal-store#reactive-store-methods

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Angular: make a decision on what needs to run in the injection context
2 participants