Angular 4/5/6全局变量

A E*_*A E 100 typescript angular

我真的很难在Angular 2应用程序中创建全局变量.

我已经用Google搜索并在过去的3个小时内阅读了StackOverflow上的很多帖子,但似乎我无法让它工作.我真的希望你能帮助我,我为提出这个问题而道歉.

所以我的文件名为globals.ts,如下所示:

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


@Injectable()
export class Globals {

  var role = 'test';

}
Run Code Online (Sandbox Code Playgroud)

我想在我的组件的HTML视图中使用变量角色,如下所示:

{{ role }} 
Run Code Online (Sandbox Code Playgroud)

我已经通过以下方式将globals.ts文件添加到我的app.module.ts:

providers: [
  Globals
],
Run Code Online (Sandbox Code Playgroud)

无论我在这个文件上做了什么,它都没有用.我不想做的是必须手动导入每个组件中的globals.ts文件,这就是我想使用提供程序功能的原因.

我真的希望你能帮助我,再次抱歉.

最好的祝福,

AE

dhi*_*ilt 153

您可以Globals通过Angular依赖注入从App的任何位置访问实体.如果要Globals.role在某个组件的模板中输出值,则应该Globals像任何服务一样通过组件的构造函数注入:

// hello.component.ts
import { Component } from '@angular/core';
import { Globals } from './globals';

@Component({
  selector: 'hello',
  template: 'The global role is {{globals.role}}',
  providers: [ Globals ] // this depends on situation, see below
})

export class HelloComponent {
  constructor(public globals: Globals) {}
}
Run Code Online (Sandbox Code Playgroud)

我提供GlobalsHelloComponent,但它可以在某些HelloComponent's父组件中提供,甚至可以在AppModule.在您Globals只有无法更改的静态数据(仅限常量)之前,这无关紧要.但如果不是这样,例如不同的组件/服务可以改变那些数据,则Globals必须是单例.在这种情况下,它应该在将要使用它的层次结构的最顶层提供.让我们说这是AppModule:

import { Globals } from './globals'

@NgModule({
  // ... imports, declarations etc
  providers: [
    // ... other global providers
    Globals // so do not provide it into another components/services if you want it to be a singleton
  ]
})
Run Code Online (Sandbox Code Playgroud)

此外,它不可能像你那样使用var,它应该是

// globals.ts
import { Injectable } from '@angular/core';

@Injectable()
export class Globals {
  role: string = 'test';
}
Run Code Online (Sandbox Code Playgroud)

更新

最后,我在stackblitz上创建了一个简单的演示,其中single Globals在三个组件之间共享,其中一个组件可以更改其值Globals.role.

  • @punkouter我用Plunker演示链接更新了答案.希望它能帮到你! (3认同)
  • 这有点旧帖,但我只想说我爱你.救了我的一天! (3认同)
  • 但是当我在另一个组件中得到它时(某些东西= globals.role;)我得到'测试'..不是我赋予它的值. (2认同)
  • @AtulStha我刚刚将Plunker的演示转移到了Stackblitz,感谢这个问题. (2认同)

Mar*_*sky 19

我为此使用环境.它自动工作,您不必创建新的可注入服务,对我来说最有用,不需要通过构造函数导入.

1)在您的environment.ts中创建环境变量

export const environment = {
    ...
    // runtime variables
    isContentLoading: false,
    isDeployNeeded: false
}
Run Code Online (Sandbox Code Playgroud)

2)在*.ts文件中导入environment.ts 并创建公共变量(即"env")以便能够在html模板中使用

import { environment } from 'environments/environment';

@Component(...)
export class TestComponent {
    ...
    env = environment;
}
Run Code Online (Sandbox Code Playgroud)

3)在模板中使用它...

<app-spinner *ngIf='env.isContentLoading'></app-spinner>
Run Code Online (Sandbox Code Playgroud)

在*.ts ...

env.isContentLoading = false 
Run Code Online (Sandbox Code Playgroud)

(或者只是environment.isContentLoading,以防你不需要模板)


您可以在environment.ts中创建自己的全局变量集,如下所示:

export const globals = {
    isContentLoading: false,
    isDeployNeeded: false
}
Run Code Online (Sandbox Code Playgroud)

并直接导入这些变量(y)

  • 当您进行生产构建时呢?你所有的东西都在两个地方吗? (2认同)
  • 这是最好的方法。@Mulperi不需要在environment.ts中创建全局变量。只需在应用目录中创建具有上述导出功能的globals.ts,然后将此文件导入您要使用这些全局变量的位置即可。 (2认同)
  • 我同意。我最近修改了这个解决方案,就像@PrasadW 指出的那样。 (2认同)
  • 发明 Angular 的人应该考虑到这种简单性! (2认同)