ngrx在分派动作时是否可能不会触发相关的效果?

时间:2018-08-17 21:05:57

标签: javascript angular ngrx

我使用以下命令调度我的ngrx动作

store.dispatch(new MyAction(payload));

MyAction具有关联的作用。当我分派动作时,会触发效果。太好了!

这按预期工作。但是我只希望有时能产生效果。你可以做这样的事情吗?

store.dispatch(new MyAction(payload), {triggerEffect: false});

还是我需要创建一个第二动作,该第二动作的作用与减速器的MyAction完全相同,而根本没有将效果附加到第二动作上?如果可以避免,我宁愿不走这条路。谢谢

3 个答案:

答案 0 :(得分:2)

让我们说,您仅想在有效负载具有特定属性的情况下触发效果。我会做这样的事情。

@Effect() myEffect$ = this.action$
    .ofType('ACTION_TYPE')
    .filter(action => action.payload.triggerSideEffect)
    .map( () => Observable.of({type: "DO_SIDE_EFFECT"}));

答案 1 :(得分:1)

我认为没有内置的解决方案,但是您可以使用有效负载属性来控制效果执行:

将该属性添加到您的动作创建者中:

class MyAction {
  readonly type = MY_ACTION;
  constructor(private payload: {data: any, shouldTriggerEffect: boolean}) {}
}

过滤效果:

@Effect()
myAction$ = this.actions$.pipe(
  ofType(ActionTypes.MY_ACTION),
  filter(action => action.payload.shouldTriggerSideEffect),
  // do your stuff
);

答案 2 :(得分:1)

这取决于您要实现的目标。

在一般情况下,在不知道细节的情况下,我将进行2次操作。简单明了。

现在,根据您要执行的操作,有2个选项:

  1. 具有获得动作的代理效果,并基于某些属性触发(或不触发)其他效果将处理的新动作。

  2. 如果基于决策的操作数据最终通过化简器处于状态,则可以有效地使用withLatestFrom运算符,采用最新状态,并且由于顺序得到保证(化简器首先对操作做出反应然后效果),然后您可以根据状态做出决定。