如何创建角度服务的新实例?

时间:2018-03-08 15:58:55

标签: javascript angular

所以,我正在为这个问题寻找解决方案......好吧,让我分享一下我的想法,可能你可以帮助我或者说我错了。

简介

当您创建角度应用程序时,通常会创建一个名为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)用于填充此实例。

3 个答案:

答案 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)

我认为真正的问题是你为什么要这种行为?

如果它关于状态,那么您应该使用状态管理工具,例如ngrxng2redux,以便从您的组件和服务中抽象出状态。

然后,您可以干净地注销并使用不同的事件登录,并处理每次操作时状态应该发生的事情。

答案 2 :(得分:0)

尝试利用BehaviorSubjects。这应该放在您的服务类别中:

public userData:新的BehaviorSubject({});

一旦获得登录的用户数据,就存储在这样的行为主题中

在组件中:

this.userService.userData.next(response);

,当您需要在其他组件之间获取它时,只需使用以下命令即可:

this.userService.userData.value();

N.B .:当用户刷新时,无论是服务还是行为主题,都将刷新。因此,请尝试在seasion存储或Node缓存中使用它。