ROOT_EFFECTS_INIT 从未被调用
ROOT_EFFECTS_INIT is never called
我在 ngrx 中有一个效果叫做 SelfEffect
我希望它在加载时执行以下操作:
@Effect()
init$ = this.actions$.pipe(
ofType(ROOT_EFFECTS_INIT),
concatMap(() => of().pipe(withLatestFrom(this.store.pipe(select(IsAuthenticated))))),
switchMap(([_, isLogged]) => (isLogged ? of(new GetSelfRequest()) : EMPTY))
);
现在,此效果已在 app.store.module
中注册
@NgModule({
imports: [
StoreModule.forRoot(appReducers, { metaReducers }),
EffectsModule.forRoot([AuthEffects, AlertEffects, SelfEffects]),
StoreRouterConnectingModule.forRoot({
serializer: RouterSerializer,
navigationActionTiming: NavigationActionTiming.PostActivation,
}),
StoreDevtoolsModule.instrument({
name: 'Dev'
}),
],
providers: [Store],
})
在app.module.ts
中调用
@NgModule({
imports: [
AppRoutingModule,
AppStoreModule,
...
]
为什么这个事件从不调度?是因为我使用路由器商店吗?
问题出在
of().pipe(withLatestFrom)
空 of()
永远不会发出事件,因此 withLatestFrom
也不能发出。
整行可以简化为单个 switchMapTo
(concatMap
是危险的,因为 ROOT_EFFECTS_INIT
可能触发更多次 - 每次都会增加动作)。
@Effect()
init$ = this.actions$.pipe(
ofType(ROOT_EFFECTS_INIT),
switchMapTo(this.store.pipe(select(IsAuthenticated))),
switchMap((isLogged) => (isLogged ? of(new GetSelfRequest()) : EMPTY))
);
PS:我会考虑将 take(1)
添加到管道中的某处(取决于您想要实现的目标),以便您可以完全控制正在发生的事情。
我在 ngrx 中有一个效果叫做 SelfEffect
我希望它在加载时执行以下操作:
@Effect()
init$ = this.actions$.pipe(
ofType(ROOT_EFFECTS_INIT),
concatMap(() => of().pipe(withLatestFrom(this.store.pipe(select(IsAuthenticated))))),
switchMap(([_, isLogged]) => (isLogged ? of(new GetSelfRequest()) : EMPTY))
);
现在,此效果已在 app.store.module
@NgModule({
imports: [
StoreModule.forRoot(appReducers, { metaReducers }),
EffectsModule.forRoot([AuthEffects, AlertEffects, SelfEffects]),
StoreRouterConnectingModule.forRoot({
serializer: RouterSerializer,
navigationActionTiming: NavigationActionTiming.PostActivation,
}),
StoreDevtoolsModule.instrument({
name: 'Dev'
}),
],
providers: [Store],
})
在app.module.ts
@NgModule({
imports: [
AppRoutingModule,
AppStoreModule,
...
]
为什么这个事件从不调度?是因为我使用路由器商店吗?
问题出在
of().pipe(withLatestFrom)
空 of()
永远不会发出事件,因此 withLatestFrom
也不能发出。
整行可以简化为单个 switchMapTo
(concatMap
是危险的,因为 ROOT_EFFECTS_INIT
可能触发更多次 - 每次都会增加动作)。
@Effect()
init$ = this.actions$.pipe(
ofType(ROOT_EFFECTS_INIT),
switchMapTo(this.store.pipe(select(IsAuthenticated))),
switchMap((isLogged) => (isLogged ? of(new GetSelfRequest()) : EMPTY))
);
PS:我会考虑将 take(1)
添加到管道中的某处(取决于您想要实现的目标),以便您可以完全控制正在发生的事情。