我有一个 ngRx 信号存储,它是一个全局单例
全球商店
(组件被销毁时不会被销毁)
export const Store = signalStore(
{providedIn: 'root'},
withState(initialState),
withMethods((store) => {
const apiService = inject(APIService);
return {
loadObjectByID: rxMethod<string>(
pipe(
filter(id => id !== undefined),
tap(() => patchState(store, { isLoading: true, isLoaded: false })),
take(1),
switchMap((id) => {
return apiService.getObject(id).pipe(
tap({
next: (object) => patchState(store, { object }),
finalize: () => {
patchState(store, { isLoading: false, isLoaded: true });
}
})
);
})
)
)
}
})
);
然后在组件中,我执行以下操作:
组件
protected store = inject(Store)
protected ngOnInit(): void {
this.Store.loadObjectByID(this.objectID) --> only method available on this is '.unsubscribe'
}
文档说“默认情况下,rxMethod需要在注入上下文中执行。它与其生命周期相关,并在注入器被销毁时自动清理。”
这是什么意思?这个实例中的注入上下文是什么?这部分组件,protected store=inject(Store)?我是商店的这一部分,{providedIn: 'root'}?
组件中通过 this.Store.loadObjectByID(this.objectID) 创建的 observable 是否需要手动取消订阅(在 store 中调用反应式方法时),还是在组件销毁时自动取消订阅?
或者它会持续存在,因为该服务是全局服务,只有在完整的应用程序刷新时才会被销毁?
提前致谢。
rxMethod
,以便让 Angular 处理取消订阅。
ngOnInit 不在注入上下文中您有 2 个解决方案:
rxMethod
接受选项作为第二个参数,您可以提供一个注入器来保留注入上下文之外的行为 - 请记住,这是不太推荐的方法。@
@Component({ /* ... */ })
export class NumbersComponent implements OnInit {
readonly #injector = inject(Injector);
ngOnInit(): void {
const logNumber = rxMethod<number>(
tap(console.log),
{ injector: this.#injector }
);
logNumber(10);
}
}