【问题标题】:Make a service variable global in Angular 2在 Angular 2 中创建一个全局服务变量
【发布时间】:2017-08-03 09:35:10
【问题描述】:

如何在 Angular 2 中将服务中的变量作为全局变量,以便两个不同的组件可以访问和修改它?

public myMap : Map<string, string> = new Map<string, string>();

这是服务中的地图,我最初使用组件填充它。现在在应用程序中经过一段时间后,我需要使用不同的组件访问相同的填充地图。我该怎么做?

当我使用另一个组件访问地图时,它显示为未定义。

【问题讨论】:

  • 您是否在两个组件之间共享了您的服务?
  • 1.在服务器中的每个组件中获取数据。 2.一次取数据,存入本地存储,再次取数据时更新存储。
  • 组件之间如何共享服务?
  • 我不想在每个组件中获取数据,这就是为什么我创建了一个 Map 以便数据库不会被两次命中并且数据访问会更快。

标签: angular angular2-services


【解决方案1】:

在所有组件之间共享服务。在服务内部,声明一个变量,该变量将保存您想要在组件之间共享的值。然后使用 getter 和 setter 从服务中分配、检索或修改变量,而无需调用服务器。

这是一个简单的example 在多个组件之间共享一个变量。

shared.service.ts:

import { Injectable } from '@angular/core';

@Injectable()
export class AppService{
    myGlobalVar;

    constructor(){
      this.myGlobalVar = true;
      alert("My intial global variable value is: " + this.myGlobalVar);
    }

    setMyGV(val: boolean){
      this.myGlobalVar = val;
    }

    getMyGV(val: boolean){
      return this.myGlobalVar;
    }
}

app.module.tsProviders中添加服务:

@NgModule({
  ...
  providers: [ AppService ],
  bootstrap: [ AppComponent ]
})
export class AppModule { }

component.ts 中注入服务并使用它来设置、检索或修改变量。

constructor(private appService: AppService) { }

  changeGV(val){
    this.appService.setMyGV(val);
  }

  showGV(){
    alert("GV: " + this.appService.getMyGV());
  }

【讨论】:

  • 在上面的例子中我可以有另一个访问变量 myGlobalVar 的组件吗?
  • 不看代码就无法真正说出为什么它不起作用。确保您已在 app.module.ts providers 中添加服务,而不是在每个组件中单独添加。对于上面的示例,您可以拥有尽可能多的组件来共享服务,同样的方式,您注入服务并使用 get 和 set 方法。这是一个example,其中服务由六个组件共享。
  • 好的,我明白了。服务应该私下注入还是公开注入?私人或公共如何影响它?
  • 服务通常被注入为private。您可以阅读 publicprivate here
  • 是所有连接用户的共享服务还是仅当前?我想确保它是针对每个用户的,而不是针对所有用户的。
【解决方案2】:

Angular 服务对于您注入服务的组件下方的所有组件都是单例的。

换句话说,当你在组件 A 中注入你的服务时,它会获取该服务已经存在的实例,如果不存在,它会创建 一个实例。

因此,当所有组件都获得相同的实例时,其中的每个属性都将为它们共享。

【讨论】:

  • 组件下面是什么意思?我使用的两个组件完全不相关。
  • 对不起,当我们在模块中将服务定义为提供者时,它将是属于该模块的所有组件的单例。
猜你喜欢
  • 2021-12-11
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 2020-09-24
  • 2021-03-01
相关资源
最近更新 更多