所以,我正在为这个问题寻找解决方案......好吧,让我分享一下我的想法,可能你可以帮助我或者说我错了。
简介
当您创建角度应用程序时,通常会创建一个名为AuthService的服务,其中包含login,logout,refreshToken等方法。
但是,您还需要存储当前用户的某个位置,它将是登录到您的应用程序的用户。通常你会创建类似UserModel的东西,包括firstname,lastname,balance,group,friends等字段。 因此,您在AuthService中存储此模型的实例。
在获得活跃用户之后,您需要在@component中注入Auth服务,如下所示:
constructor(private _authService: AuthService) {
this.user = this._authservice.user;
}
是的?
问题:
所以,我不希望注入authService来获取当前用户。我希望有所有模块允许的CurrentUser服务,并且将包含有关已记录用户的所有信息,如UserModel。
我想要这样的事情:
constructor(public user: UserService) {
}
但当用户注销时,我需要清理UserService并将每个字段重新初始化为默认值。所以,这一步是一个真正的问题。 是的,当然,我可以按照对象字段循环播放,但它很糟糕! 我想创建UserService的新实例并在全局范围内重新分配。
如果您仍然不明白 - 在我的根AppModule中将UserService声明为提供者,如下所示:
@NgModule({
imports: [
...
],
declarations: [
...
],
providers: [
UserService
]
})
export class AppModule {}
问题: 如何为UserService创建新实例并将其替换为全局?
当用户注销时,我想要这样做,我的所有组件都将获得新的,清理没有填充字段等的UserService实例。当新用户登录时,我将使用UserService类的方法,如user。 updateUser(data)用于填充此实例。
答案 0 :(得分:2)
这可以通过将服务UserService
声明为用户登录后指向的最高级别组件(比如HomeComponent)来实现。继续在您的根authService
中声明您的app.module.ts
作为提供商,以便它在整个应用程序生命周期内保持单身。
通过执行此操作,每次用户登录时都会创建UserService
,并且它将可供所有家庭组件的子项使用(这就是为什么您希望确保在最高级别提供它级别组件),每次用户注销时都会销毁它。为每个用户会话创建一个单例。
@Component({
selector: 'home',
templateUrl: './home.component.html',
styleUrls: ['./home.component.css'],
providers: [UserService]
})
export class HomeComponent {...}
我想强调最高级别的组件。从架构的角度来看,基本上你想要做的是(在这个例子中)确保HomeComponent本质上是登录用户之后需要访问的所有路由/组件的容器组件。否则,对于兄弟组件而言,这种技术不会成功,因为UserService
的共享取决于分层组件结构。
答案 1 :(得分:0)
我认为真正的问题是你为什么要这种行为?
如果它关于状态,那么您应该使用状态管理工具,例如ngrx或ng2redux,以便从您的组件和服务中抽象出状态。
然后,您可以干净地注销并使用不同的事件登录,并处理每次操作时状态应该发生的事情。
答案 2 :(得分:0)
尝试利用BehaviorSubjects。这应该放在您的服务类别中:
public userData:新的BehaviorSubject({});
一旦获得登录的用户数据,就存储在这样的行为主题中
在组件中:
this.userService.userData.next(response);
,当您需要在其他组件之间获取它时,只需使用以下命令即可:
this.userService.userData.value();
N.B .:当用户刷新时,无论是服务还是行为主题,都将刷新。因此,请尝试在seasion存储或Node缓存中使用它。