angular - Ngrx/effects:在加载页面之前等待存储中的用户数据
问题描述
我有user.service
,我从数据库中获取页面加载时的用户数据并将它们保存到通过以下方式存储user.action
:
export class UserService {
user$ = this.store.select('user')
constructor(
private fireStore: AngularFirestore,
private fireAuth: AngularFireAuth,
private store: Store<AppState>
) {
this.fireAuth.authState.subscribe(auth => {
if (auth) {
const { uid } = auth
this.fireStore.collection('users').doc(uid).ref.get()
.then(data => {
const user = data.data() as User
this.store.dispatch(new UserActions.SaveUser(user))
})
} else {
this.store.dispatch(new UserActions.RemoveUser())
}
})
}
}
所以,如果数据库返回用户数据——我将它们保存到存储中,如果没有——这意味着用户没有登录,我从“用户”存储中删除用户数据。
我希望我的主页等到User.service
加载之前获取数据,所以我认为我必须为此创建效果:
export class UserEffects {
@Effect()
loadUser$ = this.actions$.pipe(
ofType(UserActions.SAVE_USER),
map(user => user)
)
constructor (
private actions$: Actions,
private store: Store<AppState>
) {}
}
但是如果我这样做,应用程序开始无休止地调度UserActions.SAVE_USER
动作:
我应该如何以正确的方式做呢?
解决方案
您应该执行一些操作,例如启动应用程序时调度的 getUsers 和 setUser,或路由到 /home。同样在你的减速器中,让这两个在你的 switch(actionType) 中存储/修改你的状态。之后,您只需使用 @Effect() 将效果绑定到 getUsers,因此每当要调用 getUsers 时,也会调用效果并从那里在您的减速器中调用 setUser。作为参考,请查看以下 2 篇文章:
https://www.intertech.com/Blog/ngrx-tutorial-actions-reducers-and-effects/
https://www.intertech.com/Blog/ngrx-tutorial-add-state-to-feature-module/
要触发数据加载,您可以在路由上使用Angular Lazy Loading,例如:localhost:4200/home
编辑:也不需要你的服务,直接在你的效果中实现它。
推荐阅读
- google-sheets - 在 Google 表格中以非编程方式编辑新行时的默认单元格值
- php - PHP选择未知深度的数组
- c++11 - 如何在第二行设置 QTableWidget 的标题?
- next.js - 如何在 NextJS 的新选项卡中打开链接?
- python - Python DataFrame - 从行值创建索引
- ms-access - 向父表单添加新记录时子表单出现问题
- sap-erp - SAP S/4HANA 本地 REST API
- ios - 覆盖基本 iOS 手势
- javascript - 如何在其中使用带有 React 组件的变量?
- macos - Flutter MacOS 获取 CMD 的 LogicalKeyboardKey