[英]How to create new instance of angular service?
所以,我正在尋找問題的解決方案......好吧,讓我分享我的想法,可能你可以幫助我或者說我錯了。
介紹:
當您創建角度應用程序時,通常您會創建調用 AuthService 之類的服務,其中包含登錄、注銷、refreshToken 等方法。
但是,您還需要在某個地方存儲您當前的用戶,它將是登錄您的應用程序的用戶。 通常你會創建類似 UserModel 的東西,其中包含名字、姓氏、余額、組、朋友等字段。因此,你在 AuthService 中存儲這個模型的實例。
之后,為了獲得活躍用戶,您需要像這樣在 @component 中注入您的 Auth 服務:
constructor(private _authService: AuthService) {
this.user = this._authservice.user;
}
是的?
問題:
所以,我不想注入 authService 來獲取當前用戶。 我想要 CurrentUser 服務,該服務將在所有模塊中被允許,並且將包含有關已登錄用戶的所有信息,例如 UserModel。
我想要這樣的東西:
constructor(public user: UserService) {
}
但是當用戶注銷時,我需要清理 UserService 並將每個字段重新初始化為默認值。 因此,這一步是一個真正的問題。 是的,當然,我可以按對象字段做 for... in cycle,但這很糟糕。 我想創建 UserService 的新實例並在全局范圍內重新分配。
如果您仍然不明白 - UserService 在我的根 AppModule 中被聲明為提供者,如下所示:
@NgModule({
imports: [
...
],
declarations: [
...
],
providers: [
UserService
]
})
export class AppModule {}
問題:如何為 UserService 創建新實例並在全局范圍內替換它?
當用戶注銷時,我想這樣做,我的所有組件都將獲得新的、干凈的 UserService 實例,沒有填充字段等。當新用戶登錄時,我將使用 UserService 類的方法,如 user.updateUser(data)填充此實例。
這可以通過將服務UserService
聲明為您的用戶在登錄后被定向到的最高級別組件(例如 HomeComponent)來實現。 繼續在您的根app.module.ts
您的authService
聲明為提供者,以便它在整個應用程序生命周期內保持為單例。
通過這樣做,每次用戶登錄時都會創建UserService
,並且它將對 home 組件的所有子組件可用(這就是為什么您要確保在最高級別組件上提供它),並且它將每次用戶注銷時都會被銷毀。 為每個用戶會話創建一個單例。
@Component({
selector: 'home',
templateUrl: './home.component.html',
styleUrls: ['./home.component.css'],
providers: [UserService]
})
export class HomeComponent {...}
我想強調最高級別的組件。 本質上,從架構的角度來看,您想要做的是(在此示例中)確保使 HomeComponent 本質上成為登錄用戶此后需要訪問的所有路由/組件的容器組件。 否則,這種技術對於同級組件將不會成功,因為UserService
的共享依賴於分層組件結構。
嘗試使用 BehaviorSubjects。 這應該在你的服務類中:
公共用戶數據:新的 BehaviorSubject({});
獲得登錄用戶數據后,像這樣存儲在行為主題中
在組件中:
this.userService.userData.next(響應);
當您需要跨其他組件獲取它時,只需使用它:
this.userService.userData.value();
注意:當用戶刷新時,無論是服務還是行為主體,都會刷新。 所以,嘗試在季節存儲或節點緩存中使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.