ngRx继承了无效的效果类

时间:2018-05-25 15:09:09

标签: angular ngrx ngrx-effects

我在mono-repo中有两个应用程序,一个是另一个的免费子集,因此免费的所有功能都包含在非自由的中。

我试图设置我的效果,以便有一个核心效果类来实现所有常见效果,然后在非自由项目中扩展它以添加其他效果。这不起作用。两个应用程序都可以使用核心效果,只要我定义了所有效果,但只要我为类别添加更多效果,就会停止识别核心效果。

以下是设置:

  • core.effects.ts包含定义2个vanilla效果的CoreEffects类 - LoadLayout和ToggleSidebar
  • not-free.effects.ts包括扩展CoreEffects类的
  • 的NotFreeEffects类
  • free.effects.ts包含FreeEffects类,它扩展了CoreEffects类,并没有定义任何其他效果。
  • 在我的模块中,我导入效果模块并指定继承的效果类:EffectsModule.forRoot([NotFreeEffects])EffectsModule.forRoot([FreeEffects])。如果我正确地理解了这一点,这意味着我的继承类正确设置,因为仍然可以看到核心效果(除非我在继承的类中定义其他效果)

例如,LoadLayout效果如下所示(其他类似):

@Effect()
  loadLayout$: Observable<Action> = this.actions$
    .ofType(CoreLayoutActions.LOAD_LAYOUT)
    .switchMap(() => this.layoutService.loadLayout())
    .map(
      (layoutState: ICoreLayoutState) =>
        new CoreLayoutActions.LoadLayoutSuccessAction(layoutState)
    );

当我使用此设置运行任一应用程序时,一切正常。我在reducers中添加了日志语句,因此我可以看到LoadLayoutSuccess消息何时在reducer中传递和处理。

只要我向NotFreeEffect类添加另一个效果(即免费应用程序未使用的那个),就不再处理核心效果 - 我在reducers中的日志语句不再表示已调度LoadLayoutSuccess。 除了向非自由类添加完全不相关的效果之外,没有任何改变。免费的应用程序继续工作,非免费的不会。如果我从非自由中删除了这个额外的效果,它会再次开始识别核心效果。

我错过了什么?你能继承像这样的效果类吗?

详细说明:

  • Angular CLI:1.7.1
  • 节点:8.9.4
  • 操作系统:win32 x64
  • Angular:5.2.7 ...动画,常见,编译器,编译器 - cli,核心,表单 ...语言服务,平台浏览器,平台浏览器动态 ...路由器

  • @ angular / cdk:5.2.5

  • @ angular / cli:1.7.1
  • @ angular / material:5.2.5
  • @ angular-devkit / build-optimizer:0.3.2
  • @ angular-devkit / core:0.3.2
  • @ angular-devkit / schematics:0.3.2
  • @ ngtools / json-schema:1.2.0
  • @ ngtools / webpack:1.10.1
  • @ schematics / angular:0.3.2
  • @ schematics / package-update:0.3.2
  • 打字稿:2.6.2
  • webpack:3.11.0
  • ngrx:5.2.0
  • @ nrwl / nx:1.0.3

谢谢,

TTE

3 个答案:

答案 0 :(得分:3)

这是各种症状的一个已知问题。本质上,在效果的上下文中使用扩展是错误的。我的经验是,只要您在子类中没有任何影响,就可以在基类中起作用。
https://github.com/ngrx/platform/issues/586
https://github.com/ngrx/platform/issues/1234

更新:由于这种提交https://github.com/ngrx/platform/commit/e7ae8a228ee4338b6beac4baf0bba745fa32c917#diff-708a6e5fc1424e81075508aee61cb59f的效果在子类化时根本不再起作用。原因是使用“ hasOwnProperty”,而不是直接访问effects-metadata-property。

不幸的是,Ngrx团队不想更改此行为
https://github.com/ngrx/platform/pull/890

有关解决方法,请参见this answer

答案 1 :(得分:3)

您可以尝试这种方式。

abstract class GenericEffects {

 protected constructor(
   protected actions$: Actions,
 ) {}

 protected _someGenericEffect$ = this.actions
  .pipe(
      ofType('GENERIC_ACTION')
      ...
    )
}


class SpecificEffects extends GenericEffects {
    @Effect()
    someSpecificEffect$ = this._someGenericEffect$;
}

答案 2 :(得分:0)

自版本8.0.0-beta.0起,NgRx提供了createEffect函数。

要使NgRx效果在继承的类中起作用,只需使用新的createEffect函数(如下面的代码片段)替换修饰的效果即可:

import { createEffect, ofType } from '@ngrx/effects';

loadLayout$ = createEffect(() => this.actions$...);

您可以通过运行来安装最新的Beta(您可能还需要将rxjs更新为@latest):

npm install --save @ngrx/store@next @ngrx/effects@next @ngrx/schematics@next @ngrx/store-devtools@next