2017-10-10 55 views
-1

這是an earlier question I posted的後續問題。如何在Angular 2+中存儲常量?

我的問題是關於在服務上調用方法時出現的奇怪日誌輸出。 console.log輸出未打印服務明確定義的數據。事實證明,罪魁禍首是在調用服務方法時,使用的上下文是調用該組件的上下文。

所以我的問題是:在Angular 2+的多個組件中存儲變量的正確方法是什麼?

例如,假設我想保留一個變量isLoggedIn。我在哪裏保持這個變量?我無法將它保留在服務中,因爲當組件調用該服務時(即authService.getLoggedInStatus()),它們不會需要獲取該服務的值,而是潛在地獲取該組件中具有相同名稱的變量的isLoggedIn值。

那麼你如何跟蹤Angular中的共享變量?

+2

爲什麼會「authService.getLoggedInStatus()」給同名變量的組件中的價值?這是一個有效的方法。 @Injectables是單身人士,適合存儲值。 – omeralper

+0

我個人在我的一個項目中使用了這種非常確切的方法,通過'BehaviourSubject'將所登錄的用戶數據存儲在所有需要登錄的''組件'調用的'Service'中;它工作得很好。此外,如果所有服務都「訂閱」到一項服務中,則它具有優勢,當它發生更改時,所有組件都會知道更改。 I.E註銷由所有'subscribe'rs自動註冊 –

回答

0

@注入服務是單例。您可以在聲明組件的相關模塊上提供此服務。通過在主題組件中依賴注入此服務,您可以訪問其公共屬性。因此,您可以共享這些屬性和它們的值

0

如果你想在任何地方應用保持一個全局變量isLoggedIn accessable,將其放置在一個@Injectable service作爲singleton服務是完全有效的。爲了確保它是單服務,您應該只在app.modules如

import { BrowserModule } from '@angular/platform-browser'; 
import { NgModule } from '@angular/core'; 
import { SingletonService } from './Singleton.service'; 

@NgModule({ 
declarations: [ 
    AppComponent, 
], 
imports: [ 
    BrowserModule, 
    FormsModule 
], 
providers: [SingletonService], 
bootstrap: [AppComponent] 
}) 
export class AppModule { } 

聲明,如果你還在組件通過這樣添加:

@Component({ 
    selector: 'app-home', 
    templateUrl: './home.component.html', 
    styleUrls: ['./home.component.scss'], 
    providers: [SingletonService] 
}) 

您初始化一個新的服務實例,並且您想要的全局isLoggedIn將在該組件中擁有它自己的實例。

希望這給你一些如何使用@Injectable()角度存儲全局變量的感覺。對依賴注入

更多信息here.