angular - 为什么 Ngrx-Effects 不在继承的泛型类中自动订阅

标签 angular typescript ngrx ngrx-effects

我的项目中有几个效果类,它们由通用类扩展。从通用类继承的所有效果都不会自动订阅。相反,我必须在通用类的构造函数中手动订阅 effect/observable:

    @Injectable()
    export class GenericEffects<T extends Action, K> {
     action: T;
     constructor(
       TCreator: { new (): T },
      protected actions: Actions,
      protected store: Store<K>,
      protected route: string

      ) {
       this.action = new TCreator();

       --> this.effect1.subscribe(); <---
    }

    @Effect({ dispatch: false })
    effect1 = this.actions.ofType(genericActions.EFFECT_1).pipe(
      withLatestFrom(this.store.select<RouterReducerState>('route')),
      map(([action, routerState]) => routerState.state.url),
      map(url => {
        if (url.indexOf(this.route) !== -1 && url.length === 
          this.route.length + 1) {
        this.store.dispatch(this.action);
      }
    })
  );
}

FeatureEffectsModule:

    @Injectable()
    export class FeatureEffects extends GenericEffects<
      featureActions.WhatEverAction,
      fromFeature.State
     > {
      constructor(
        actions: Actions,
        store: Store<fromFeature.State>,
        private service: FeatureService
      ) {
        super(
          featureActions.WhatEverAction,
          actions,
          store,
          'foo'
        );
      }
    }

我错过了什么或者我必须手动执行此操作的原因是什么?

最佳答案

由于效果在非通用版本中触发,我不会考虑订阅通用版本的基类构造函数。我发现在派生类中重新声明效果是有效的,所以我接受这种代码重复。在您自己的示例中,我添加了 1 行:

@Injectable()
export class FeatureEffects extends GenericEffects<
  featureActions.WhatEverAction,
  fromFeature.State
 > {
  constructor(
    actions: Actions,
    store: Store<fromFeature.State>,
    private service: FeatureService
  ) {
    super(
      featureActions.WhatEverAction,
      actions,
      store,
      'foo'
    );
  }

  @Effect()  effect1;      //   <---   like this

}

关于angular - 为什么 Ngrx-Effects 不在继承的泛型类中自动订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50986173/

相关文章:

javascript - 如何仅检测 Angular 2 表单中已更改的字段?

angular - @ngx/store/update-reducers 意外地修改了我的应用程序的状态

c# - 从 Angular 4 SPA 请求 Web API 时范围声明为空

angularjs - RouterLink 中的 QueryParams 不工作

javascript - 通过另一个实例的构造函数属性创建实例(TS2351 : This expression is not constructable)

Angular 2 Firebase如何获取对象中的数组

angular - 仅测试 ngrx 操作是否被调用就足够了吗? (单元测试)

angular - 有没有办法在 AGM map 中设置边界和缩放级别?

node.js - npm start 不打开浏览器选项卡

angular - 获取 Firestore 的 UID 引用