我的应用程序是用ngrx在angular中构建的,我调度了一个getUser()动作来检索用户ID。我调度了一个getUser()动作来检索用户ID。我想等待用户ID返回,然后从数据库服务中获取该用户的所有项目。
如何才能最好地实现这一点?我想创建一个名为getInitialData的动作&效果,将连锁动作。我有两个减速器,一个用于用户,一个用于项目。
我应该在用户的reducer中创建getInitialData动作+服务,还是应该创建一个新的reducer?
这个问题主要是基于意见,但我给你一个方法,可以用以下方法解决这个问题 ngrx/effects
.
人们经常忽略的是,效果不一定要等动作来触发,任何可观察到的东西都是触发效果的有效来源。
例如,看一下下面的效果,它将无限期地输出0,1,2,3......。它将无限期地输出0,1,2,3...。这里的源是正常的 interval
经营者从 rjxs
.
timerEffect$ = createEffect(() =>
interval(1000)
.pipe(
tap((val) => {
console.log(val);
})
), {dispatch: false}
);
也许你已经明白我的意思了,但是可以用一个简单的认证用户ID的主体或观测对象来触发效果。
loadUserData$ = createEffect(() =>
this.userId$
.pipe(
mergeMap((userId) => {
return [action1, action2, action3] // A bunch of actions that loads relevant data
})
)
);
当然你可以把它拆分得更多,但这样就可以了。
至于什么是最佳实践,我不能说。这个问题太宽泛,很有意见。
我解决这个问题的方法,是
User Actions:
UserItems动作。
然后我注册一个效果,等待GetUserSuccess动作,它返回新的动作。GetUserItems.
注意:你可以从一个效果中监听GetUserSuccess动作。减速器将首先被调用,所以当效果被调用时,商店已经更新了userId(以防你需要访问商店)。
希望能帮到你