[英]angular 2 losing data on page reload
我像这样从NGRX /存储中获取预订列表,数据可以正确输入,但在页面重新加载时会消失。 我必须更改路线才能恢复原状。
ngOnInit() {
this.store.select(state => state.authState.profile).subscribe(profile => {
this.profile = profile;
if (this.profile) {
this.userId = this.profile.$key;
}
});
if (this.userId) {
this.reservations$ = this.reservationService.loadUserReservations(this.userId);
}
}
ngOnChanges() {
if (this.userId) {
this.reservations$ =
this.reservationService.loadUserReservations(this.userId);
}
}
不知道这是否足以说明问题。
在我的身份验证服务中
this.auth$.authState.subscribe(user => {
if (user) {
const userData = user;
const userRef = db.object("users/" + userData.uid);
const dataToSet = {
displayName: userData.providerData[0].displayName,
email: userData.providerData[0].email,
photoURL: userData.providerData[0].photoURL,
providerId: userData.providerData[0].providerId,
registeredAt: new Date()
};
userRef.take(1).subscribe((user) => {
if (user.$exists()) {
// console.log('user exists', user);
this.store.dispatch(this.authActions.updateUserInfo(user));
} else {
// console.log('user does not exists');
userRef.set(dataToSet)
.then((result) => {
// console.log(result)
})
.catch((error) => {
// console.log(error);
});
}
});
// console.log('hello user', user);
this.store.dispatch(this.authActions.loginSuccess(user));
} else {
this.store.dispatch(this.authActions.logOutUser());
}
});
}
我正在使用Firebase并订阅authState的更改。 当用户登录时,我调度了一个更新商店的操作,我只使用authState.profile来过滤用户的预订,并且所有工作正常。 我在ngOnInit()上设置了可观察的Reservations $。
这里有几件事要说。
首先,store只是一个普通的,内存中的javascript对象。 这意味着页面重新加载已不复存在。
其次,如果您需要某种形式的用户Auth数据持久性,则应在用户登录后将该数据放入存储中(您已经执行的操作),并另外将其放入一些localStorage或cookie中。 然后,您应该具有读取localStorage / cookie的机制,以获取身份验证数据并在页面重新加载(或任何页面加载)时重新填充存储。 [这是一个单独的问题,请您根据具体情况提供]
现在,您可能永远不想发生的一件事是,如果用户未登录(例如,如果存储中没有authState数据),该用户最终将进入预订组件。 而这正是正在发生的事情。
您有几种解决方案。 一种可能是最好的方法是拥有AuthGuard,它将在CanActivate中针对您的预订组件使用的路由运行。
所以像这样
CheckAuthGuard:
canActivate(route: ActivatedRouteSnapshot): Observable<boolean> {
return this.store.select(yourPartOfStateWhereAuthDataIs)
.map(profileData => !!profileData)
.take(1)
.do(authenticated => {
if (!authenticated) {
this.router.navigate([ 'login' ], {
queryParams: { referer: this.createUrl(route) }
});
}
});
}
然后在您的路由中,对于保留组件路由:
{
path: '',
component: ReservationsComponent,
canActivate: [CheckAuthGuard]
}
这将确保:
现在,关于预订的另一件事。 似乎您不是从商店获得预订,而是直接从服务获得预订。 我的建议是实际上为保留部分再增加一个警卫,然后这样做:
store.select(PartOfStoreWhereReservationsAre)
并从那里使用 可能有太多的信息,但我希望您能通过它找到方法;)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.