我使用以下命令调度我的ngrx动作
store.dispatch(new MyAction(payload));
MyAction具有关联的作用。当我分派动作时,会触发效果。太好了!
这按预期工作。但是我只希望有时能产生效果。你可以做这样的事情吗?
store.dispatch(new MyAction(payload), {triggerEffect: false});
还是我需要创建一个第二动作,该第二动作的作用与减速器的MyAction完全相同,而根本没有将效果附加到第二动作上?如果可以避免,我宁愿不走这条路。谢谢
答案 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个选项:
具有获得动作的代理效果,并基于某些属性触发(或不触发)其他效果将处理的新动作。
如果基于决策的操作数据最终通过化简器处于状态,则可以有效地使用withLatestFrom
运算符,采用最新状态,并且由于顺序得到保证(化简器首先对操作做出反应然后效果),然后您可以根据状态做出决定。