【问题标题】:Do something when an action has been dispatched当一个动作被派发时做某事
【发布时间】:2019-02-27 01:40:54
【问题描述】:

假设我们有一个动作SyncUserData,它返回监听数据库变化的可观察对象。每当有更改时,该操作都会调度操作new PatchUserData(newData)

SyncUserData 操作从状态的ngxsOnInit 调度(仅一次)。

在不同的部分(例如,组件)中,每当操作 PatchUserData 正在调度时,我都想做一些事情。像这样的:

this.store.onDispatch(PatchUserData).subscribe();

我在源代码中查找了一下,但没有找到与我的示例类似的内容。

【问题讨论】:

    标签: angular ngxs


    【解决方案1】:

    直接订阅状态的另一种方法是使用 NGXS 操作流在特定操作已分派/完成时收到通知,请参阅action handlers 的文档。

    来自官方文档:

    @Component({ ... })
    export class CartComponent {
      constructor(private actions$: Actions) {}
    
      ngOnInit() {
        this.actions$.pipe(ofActionSuccessful(CartDelete)).subscribe(() => alert('Item deleted'));
      }
    }
    

    【讨论】:

    • 你是对的。发布此问题后,我使用了这种方法。这似乎更方便。
    • 是的,我现在也使用了很多次 - 特别是如果我想做某事但并不真正关心查看当前状态时
    • @EliyaCohen 这似乎是对这个问题的回答
    • 我们如何使用它来检查一个动作的完成情况?
    【解决方案2】:

    在您的情况下,您不需要订阅某个事件,您可以在您的商店中订阅 userData 并拥有它的最新版本,无论任何操作更改它。根据您的数据模型修改下一个示例并订阅 observable:

    import { Select } from '@ngxs/store';
    
    @Select(({ userData }: AppState) => userData)
      userData$!: Observable<UserData>;
    

    更多选择:https://ngxs.gitbook.io/ngxs/concepts/select

    【讨论】:

    • @Select({ userData }: AppState) =&gt; userData) 是否等于 @Select(state =&gt; state.app.userData)
    • 不,它等于@Select(state =&gt; state.userData)
    • 好的,谢谢,但如果是这样,那你为什么不输入@Select(state =&gt; state.userData)呢?
    • 用什么更适合你,我就是喜欢那种风格
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    相关资源
    最近更新 更多