【问题标题】:Ngrx Component Store: Can I call another effect inside a effect?Ngrx Component Store:我可以在效果内调用另一个效果吗?
【发布时间】:2021-05-28 14:27:06
【问题描述】:

我目前正在实现“打开一个snackbar”(效果)的功能,如果通过操作关闭snackbar 然后“打开一个对话框”(效果),最后在对话框关闭后进行API 调用(效果)。

我想在 Component Store 中实现这个功能,

openDialog = this.effect((trigger$) => 
    trigger$.pipe( 
    exhuastMap(() => this.dialog.open(comp).afterClosed().pipe(
    tap((result) => this.callApi(result))))))

snackBar = this.effect((trigger$)=>
   trigger$.pipe(
   exhuastMap(()=> this.snackBar.open("test","OK").onAction().pipe(
   tap(() => this.openDialog())))))

我注意到 effect() 的源实现将返回一个订阅,那么在一个效果内调用另一个效果是否可以? 如果没有,我将需要创建额外的状态来触发上述效果或将其中的一些转换为服务中的正常功能。

【问题讨论】:

  • 您能否添加显示this.effect 的代码?我有点困惑你想达到什么目标和在哪里。这是来自某个组件或专用 effects.ts 文件的代码吗?
  • @dallows this.effect 来自 Ngrx 组件存储库 ngrx.io/guide/component-store/effect
  • 我知道,但是你是直接注入到组件中的吗?这看起来像是一种严肃的反模式方法。你永远不会调用 effect,你会 dispatch 和 action,NgRx 会处理那个 action 的副作用。
  • 不,我创建了一个扩展componentStore类的服务,我按照指南,指南中没有调用任何动作,而是直接调用效果。
  • 我认为您需要提供更多代码才能对其他人有所帮助。话虽这么说:你不能像你所理解的那样“调用”效果,因为它们是 Observables。它们由实际订阅提供的效果的商店机制包装。但是你可以只使用简单的效果来实现你想要的:首先,你需要一个存储属性“isDialogOpen”,你可以在reducer的“closeSnackbarAction”中将该属性设置为true。然后,您的对话框组件周围有一个 *ngIf,它通过选择器侦听 isDialogOpen 属性。

标签: angular ngrx


【解决方案1】:

GitHub上的源码,调用一个效果应该没有问题。 effect 函数并没有做那么多。它只会将你调用效果的值推送到Subject(你的trigger$),所以你从哪里调用它并不重要。

【讨论】:

    猜你喜欢
    • 2022-07-17
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 2018-06-20
    • 2021-04-02
    • 2018-11-22
    相关资源
    最近更新 更多