Issue
I really struggle with creating global variables in my Angular 2 application.
So I have my file called globals.ts, which looks like this:
import { Injectable } from "@angular/core";
@Injectable()
export class Globals {
var role = 'test';
}
And I want to use the variable role in my HTML view of my component like this:
{{ role }}
I already added the globals.ts file to my app.module.ts in the following way:
providers: [
Globals
],
No matter what I did on this file, it just didn’t work. What I don’t want to do is to have to import the globals.ts file in every component manually, which is why I want to use the providers feature.
Solution
You can access Globals
entity from any point of your App via Angular dependency injection. If you want to output Globals.role
value in some component’s template, you should inject Globals
through the component’s constructor like any service:
// 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) {}
}
I provided Globals
in the HelloComponent
, but instead it could be provided in some HelloComponent's
parent component or even in AppModule
. It will not matter until your Globals
has only static data that could not be changed (say, constants only). But if it’s not true and for example different components/services might want to change that data, then the Globals
must be a singleton. In that case it should be provided in the topmost level of the hierarchy where it is going to be used. Let’s say this is 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
]
})
Also, it’s impossible to use var the way you did, it should be
// globals.ts
import { Injectable } from '@angular/core';
@Injectable()
export class Globals {
role: string = 'test';
}
Update
At last, I created a simple demo on stackblitz, where single Globals
is being shared between 3 components and one of them can change the value of Globals.role
.
Answered By – dhilt
Answer Checked By – Clifford M. (AngularFixing Volunteer)