导入在ngrx中实现的模块,并使用覆盖服务重用效果

时间:2018-06-10 22:41:46

标签: angular ngrx effects ngrx-effects

我在导入和重新使用使用ngrx实现的模块时遇到了问题。 在简单的Angular实现中,下面是用例

// Module
@NgModule({
    imports: [
        CommonModule
    ],
    declarations: [BaseComponent],
    exports: [
        BaseComponent
    ],
    providers: [
        BaseService
    ]
})
export class BaseModule { }

//component
@Component({
  selector: 'base-comp',
  templateUrl: './base.component.html',
  styleUrls: ['./base.component.css']
})
export class BaseComponent implements OnInit {

  constructor(public service: BaseService) { }

  ngOnInit() {
  }

}

如果我将BaseModule导入另一个模块,请覆盖服务并使用' base-comp'组件,我得到BaseComponent

中注入的OverriddenService实例
// module
@NgModule({
    imports: [
        CommonModule,
        RouterModule.forChild([{
            path: '',
            component: SecondComponent
        }]),
        BaseModule,
    ],
    declarations: [SecondComponent],
    providers: [
        { provide: BaseService, useClass: OverridenService }
    ]
})
export class SecondModule { }

这一切都按预期工作。 现在,如果我使用ngrx实现了模块,并且在BaseEffect(base-effect.ts)的构造函数中注入了service - 如何实现相同的结果?如果我在SecondModule中注册一个新效果,则会有两个订阅同一个动作。

 @Injectable()
export class BaseEffect {
  constructor(private actions$: Actions,
    private service: BaseService
  ) {
  }

  // Listing
  @Effect()
  listSegments$: Observable<Action> = this.actions$.ofType<MyAction>(MY_ACTION)
    .map((action: MyAction) => action.payload)
    .mergeMap((payload: Query) => {
      return this.service.getList(payload).map(response =>
        new ActionComplete(response)
      )
    });
}

0 个答案:

没有答案