使用 RxDB 反应工厂时的 NG0602

问题描述 投票:0回答:1

我的用例:在计算的角度信号内使用反应式 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才能使我的用例正常工作?

angular signals rxdb
1个回答
0
投票

正如这个 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 }));
    },
  }
};

分叉示例

© www.soinside.com 2019 - 2024. All rights reserved.