Angular - NGRx - 信号存储 - 我需要取消订阅响应式方法吗?

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

我有一个 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 中调用反应式方法时),还是在组件销毁时自动取消订阅?

或者它会持续存在,因为该服务是全局服务,只有在完整的应用程序刷新时才会被销毁?

提前致谢。

angular signals ngrx-store
1个回答
0
投票
  1. 全局存储将在应用程序结束时被销毁(您将其配置为单例)。
  2. 根据 docs - 您需要在注入上下文中运行
    rxMethod
    ,以便让 Angular 处理取消订阅。 ngOnInit 不在注入上下文中

您有 2 个解决方案:

  1. 手动取消订阅。
  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);
      }
    }
    
      
    
   
© www.soinside.com 2019 - 2024. All rights reserved.