NgRx效果加载两​​次

时间:2018-09-07 09:03:45

标签: angular ngrx ngrx-effects

我有一个简单的功能模块,该模块提供服务并将其自己的统计信息片段作为功能导入:

@NgModule({
  imports: [
    CommonModule,
    StoreModule.forFeature('alarms', alarmsReducer, { initialState: alarmsInitialState }),
    EffectsModule.forFeature([AlarmsEffects])
  ],
  declarations: [],
  providers: [
    AlarmsFacade,
    AlarmsService
  ]
})
export class AlarmsModule {
}

我正在其他两个模块中导入此模块,一个页面需要访问服务,而AppModule则是我需要在此处导入以便正确初始化状态的页面。

当我检查Redux DevTools时,我可以清楚地看到@ngrx/store/update-reducers被功能alarms调用了两次。这样会导致状态被冻结,从而停止所有效果(包括与警报功能无关的效果)。

下面的时间轴可以显示问题(效果初始化后会触发第三个@ngrx/store/update-reducers动作,而目前只有两个功能,其中包含功能“警报”的还原器):

Redux DevTools timeline

如何避免将效果加载两​​次?我试图从AppModule中删除该模块,但是由于没有为我的选择器提供默认模块,因此它破坏了警报状态。

4 个答案:

答案 0 :(得分:1)

这是我的问题:

升级到ngrx 8后,我没有从过渡到createEffect的效果中删除@Effect()装饰器。

我从效果中删除了{dispatch:false}(现在使用createEffect),而不是将它们作为第二个参数放在箭头函数之后。

另请参阅:Effect gets called twice when using StoreDevtoolsModule.instrument()

答案 1 :(得分:0)

如果您需要多个模块中的部分状态,则其显然不是功能状态,而是主要状态。因此,将该切片移到您的主模块中,并在那里执行归约器/效果。

答案 2 :(得分:0)

如果您使用的是角度6,则可以执行ProvideInRoot功能。

cs

答案 3 :(得分:-1)

如果您订阅可观察的效果本身,也会获得两次触发效果,例如通过将效果与其他效果(而不是它们分发的动作)组合在一起。

您可以通过订阅效果分配的动作来解决它,或者也可以使用shareReplay()或其他类似的“热门”可观察解决方案。