我的用例:在计算的角度信号内使用反应式 rxDB.collection.find().$$() 。我很确定我误读了当前的文档:/
阅读当前的 RxDB 文档,我可以看到我可以让 RxDB 通过 reactivityFactory 提供角度信号(太棒了!!!)。如果我遵循文档,我最终会遇到
NG0602
错误,因为我们无法在反应式上下文中创建信号。请参阅:https://stackblitz.com/edit/rxdb-15-angular-17-playground-azqzjo?file=src%2Fapp%2Fapp.component.ts
问题来自于这样的事实
protected cars = computed(() => {
if (this.isLoading()) return [];
return this.db.cars.find().$$();
});
内部调用reactivityFactory。如果我解决这个问题,例如通过使用
toLazySignal
中的 ngxtension
实用程序,每次发生集合更改时都会创建一个信号,请参阅 https://stackblitz.com/edit/rxdb-15-angular-17-playground-1ky4q9?file=src%2Fapp %2Fapp.component.ts(打开浏览器控制台)
我应该如何正确实现reactivityFactory才能使我的用例正常工作?
正如这个 SO 答案中提到的,
computed()
无意创建新信号;相反,它应该从一个或多个现有信号的值中得出新值。
由于
reactivityFactory
函数创建了一个新信号,因此会抛出此错误。
为了解决这个问题,您可以利用 Angular 中的
untracked
函数在非反应式上下文中创建信号。这类似于 ngx-extension 库中的 toLazySignal 函数。
要修复
create signals within a reactive context
,您已显式传递注入器来发出信号
const reactivityFactory: (injector?: Injector)=> RxReactivityFactory<Signal<any>> = (injector?: Injector)=>{
return {
fromObservable(observable, initialValue: any) {
return untracked(()=> toSignal(observable, { initialValue,injector }));
},
}
};