private xSubject = new BehaviorSubject<any[]>([]);
public $x = this.xSubject.asObservable();
public xSignal = toSignal(this.xSubject, { requireSync: true });
我需要使用信号,但我不太确定与 http 和反应式上下文一起使用
TLDR;当服务被销毁时,订阅将被取消订阅
来自源代码to_signal.ts
当我们使用 toSignal 时。在内部,它获取您正在使用它的服务/组件的 destroyRef 注入器。
const cleanupRef = requiresCleanup
? options?.injector?.get(DestroyRef) ?? inject(DestroyRef)
: null;
记住注入只能在组件的根级别使用,不能在钩子或函数内部使用,因此使用注入是我们不能在函数或钩子内部使用信号的原因。
在文档中 destroyRef
DestroyRef 允许您设置回调以运行任何清理或销毁行为。此销毁的范围取决于 DestroyRef 注入的位置。如果 DestroyRef 被注入到组件或指令中,则回调将在该组件或指令被销毁时运行。否则,当相应的注入器被销毁时,回调将运行。
获取此信息后,他们会在
onDestroy
回调中调用取消订阅
// Unsubscribe when the current context is destroyed, if requested.
cleanupRef?.onDestroy(sub.unsubscribe.bind(sub));
总而言之,当组件/服务被销毁时,toSignal 就会被取消订阅。
除此之外,您还有其他两个选择。
/**
* `Injector` which will provide the `DestroyRef` used to clean up the Observable subscription.
*
* If this is not provided, a `DestroyRef` will be retrieved from the current [injection
* context](guide/di/dependency-injection-context), unless manual cleanup is requested.
*/
injector?: Injector;
/**
* Whether the subscription should be automatically cleaned up (via `DestroyRef`) when
* `toSignal`'s creation context is destroyed.
*
* If manual cleanup is enabled, then `DestroyRef` is not used, and the subscription will persist
* until the `Observable` itself completes.
*/
manualCleanup?: boolean;