2017-10-10 57 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.