UNPKG

@tanstack/angular-query-experimental

Version:

Signals for managing, caching and syncing asynchronous and remote data in Angular

212 lines (207 loc) 6.7 kB
import { QueryObserver } from '@tanstack/query-core' import { assertInjector } from './util/assert-injector/assert-injector' import { createBaseQuery } from './create-base-query' import type { Injector } from '@angular/core' import type { DefaultError, QueryKey } from '@tanstack/query-core' import type { CreateQueryOptions, CreateQueryResult, DefinedCreateQueryResult, } from './types' import type { DefinedInitialDataOptions, UndefinedInitialDataOptions, } from './query-options' /** * Injects a query: a declarative dependency on an asynchronous source of data that is tied to a unique key. * * **Basic example** * ```ts * class ServiceOrComponent { * query = injectQuery(() => ({ * queryKey: ['repoData'], * queryFn: () => * this.#http.get<Response>('https://api.github.com/repos/tanstack/query'), * })) * } * ``` * * Similar to `computed` from Angular, the function passed to `injectQuery` will be run in the reactive context. * In the example below, the query will be automatically enabled and executed when the filter signal changes * to a truthy value. When the filter signal changes back to a falsy value, the query will be disabled. * * **Reactive example** * ```ts * class ServiceOrComponent { * filter = signal('') * * todosQuery = injectQuery(() => ({ * queryKey: ['todos', this.filter()], * queryFn: () => fetchTodos(this.filter()), * // Signals can be combined with expressions * enabled: !!this.filter(), * })) * } * ``` * @param optionsFn - A function that returns query options. * @param injector - The Angular injector to use. * @returns The query result. * @public * @see https://tanstack.com/query/latest/docs/framework/angular/guides/queries */ export function injectQuery< TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, >( optionsFn: () => DefinedInitialDataOptions< TQueryFnData, TError, TData, TQueryKey >, injector?: Injector, ): DefinedCreateQueryResult<TData, TError> /** * Injects a query: a declarative dependency on an asynchronous source of data that is tied to a unique key. * * **Basic example** * ```ts * class ServiceOrComponent { * query = injectQuery(() => ({ * queryKey: ['repoData'], * queryFn: () => * this.#http.get<Response>('https://api.github.com/repos/tanstack/query'), * })) * } * ``` * * Similar to `computed` from Angular, the function passed to `injectQuery` will be run in the reactive context. * In the example below, the query will be automatically enabled and executed when the filter signal changes * to a truthy value. When the filter signal changes back to a falsy value, the query will be disabled. * * **Reactive example** * ```ts * class ServiceOrComponent { * filter = signal('') * * todosQuery = injectQuery(() => ({ * queryKey: ['todos', this.filter()], * queryFn: () => fetchTodos(this.filter()), * // Signals can be combined with expressions * enabled: !!this.filter(), * })) * } * ``` * @param optionsFn - A function that returns query options. * @param injector - The Angular injector to use. * @returns The query result. * @public * @see https://tanstack.com/query/latest/docs/framework/angular/guides/queries */ export function injectQuery< TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, >( optionsFn: () => UndefinedInitialDataOptions< TQueryFnData, TError, TData, TQueryKey >, injector?: Injector, ): CreateQueryResult<TData, TError> /** * Injects a query: a declarative dependency on an asynchronous source of data that is tied to a unique key. * * **Basic example** * ```ts * class ServiceOrComponent { * query = injectQuery(() => ({ * queryKey: ['repoData'], * queryFn: () => * this.#http.get<Response>('https://api.github.com/repos/tanstack/query'), * })) * } * ``` * * Similar to `computed` from Angular, the function passed to `injectQuery` will be run in the reactive context. * In the example below, the query will be automatically enabled and executed when the filter signal changes * to a truthy value. When the filter signal changes back to a falsy value, the query will be disabled. * * **Reactive example** * ```ts * class ServiceOrComponent { * filter = signal('') * * todosQuery = injectQuery(() => ({ * queryKey: ['todos', this.filter()], * queryFn: () => fetchTodos(this.filter()), * // Signals can be combined with expressions * enabled: !!this.filter(), * })) * } * ``` * @param optionsFn - A function that returns query options. * @param injector - The Angular injector to use. * @returns The query result. * @public * @see https://tanstack.com/query/latest/docs/framework/angular/guides/queries */ export function injectQuery< TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, >( optionsFn: () => CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>, injector?: Injector, ): CreateQueryResult<TData, TError> /** * Injects a query: a declarative dependency on an asynchronous source of data that is tied to a unique key. * * **Basic example** * ```ts * class ServiceOrComponent { * query = injectQuery(() => ({ * queryKey: ['repoData'], * queryFn: () => * this.#http.get<Response>('https://api.github.com/repos/tanstack/query'), * })) * } * ``` * * Similar to `computed` from Angular, the function passed to `injectQuery` will be run in the reactive context. * In the example below, the query will be automatically enabled and executed when the filter signal changes * to a truthy value. When the filter signal changes back to a falsy value, the query will be disabled. * * **Reactive example** * ```ts * class ServiceOrComponent { * filter = signal('') * * todosQuery = injectQuery(() => ({ * queryKey: ['todos', this.filter()], * queryFn: () => fetchTodos(this.filter()), * // Signals can be combined with expressions * enabled: !!this.filter(), * })) * } * ``` * @param optionsFn - A function that returns query options. * @param injector - The Angular injector to use. * @returns The query result. * @public * @see https://tanstack.com/query/latest/docs/framework/angular/guides/queries */ export function injectQuery( optionsFn: () => CreateQueryOptions, injector?: Injector, ) { return assertInjector(injectQuery, injector, () => createBaseQuery(optionsFn, QueryObserver), ) as unknown as CreateQueryResult }