23

我正在使用带有 Angular、ngrx/store 和 ngrx/effects 的 redux 风格的状态管理设计。每当我不从效果返回动作时,我都会收到错误消息:

Cannot read property 'type' of undefined

我研究了这个问题,发现在 elm 架构中有一种叫做“noop”的动作,当你不想用你的效果链接另一个动作时,它什么都不做,你可以调用它。在我看来,到处都调用这个 noop 动作似乎非常重复。我想知道这是否是一个不好的做法。您是否有理由不能产生不返回动作的效果?效果的意图是否总是让一个动作触发另一个动作?我想知道我是否误解了如何使用效果。

谢谢!

4

1 回答 1

43

默认情况下,ngrx/effect 调度一个动作。

如果您希望效果是“即发即弃”,您需要做的就是添加{dispatch: false}作为@Effects()装饰器的参数。

来自@ngrx/effects 文档

用装饰器装饰的Observables@Effect()应该是一个被调度的动作流。传递{ dispatch: false }给装饰器以防止操作被分派。

用法:

class MyEffects {
  constructor(private actions$: Actions) { }

  @Effect({ dispatch: false }) logActions$ = this.actions$
    .do(action => {
      console.log(action);
    });
}

在引擎盖下,这是通过ignoreElements操作员实现的。(如果您有兴趣,这里是 ngrx/effects 的源代码)。 ignoreElements有一个内置的 noop 函数,每次效果运行时都会调用它。

简而言之,ngrx/effects 中不需要显式的 noop-action。我不会直接将调度 noop-action 称为“不好的做法”,但在使用 ngrx 时肯定没有必要。

于 2017-05-18T21:19:44.110 回答