angular - Varför prenumereras inte Ngrx-Effects automatiskt i en ärvd generisk klass


Jag har det fallet att jag har flera effektklasser i mitt projekt som är utökade av en generisk klass. Alla effekter som ärvs från den generiska klassen prenumereras inte automatiskt. Istället måste jag prenumerera manuellt på effekten/observerbara i konstruktorn för den generiska klassen:

    @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'
        );
      }
    }

Vad missar jag eller vad är anledningen till att jag måste göra detta manuellt?

Svar #1

Eftersom effekterna körs i den icke-generiska versionen, skulle jag inte överväga att prenumerera i basklassens konstruktor för den generiska versionen. Jag upptäckte att om man deklarerar effekten på nytt i den avledda klassen fungerar det, så jag accepterar denna mängd av kodupprepning. I ditt eget exempel lägger jag till 1 rad:

@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

}