簡體   English   中英

如何創建新的角度服務實例?

[英]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的共享依賴於分層組件結構。

我認為真正的問題是你為什么想要這種行為?

如果它與狀態有關,那么您應該為此使用狀態管理工具,例如ngrxng2redux ,以便從您的組件和服務中抽象出狀態。

然后你可以干凈地注銷和登錄不同的事件,並處理每個動作的狀態應該發生什么。

嘗試使用 BehaviorSubjects。 這應該在你的服務類中:

公共用戶數據:新的 BehaviorSubject({});

獲得登錄用戶數據后,像這樣存儲在行為主題中

在組件中:

this.userService.userData.next(響應);

當您需要跨其他組件獲取它時,只需使用它:

this.userService.userData.value();

注意:當用戶刷新時,無論是服務還是行為主體,都會刷新。 所以,嘗試在季節存儲或節點緩存中使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM