我有一个简单的功能模块,该模块提供服务并将其自己的统计信息片段作为功能导入:
@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
动作,而目前只有两个功能,其中包含功能“警报”的还原器):
如何避免将效果加载两次?我试图从AppModule
中删除该模块,但是由于没有为我的选择器提供默认模块,因此它破坏了警报状态。
答案 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()
或其他类似的“热门”可观察解决方案。