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
}
