You should simply use a service available from the app scope. Here are some examples. Note that I've just dived into Angular2 and I might be providing suboptimal examples, but they work for me.
Basically your main (app) component can look like this:
import { Component } from 'angular2/core';
class GlobalSettings {
public authToken: string;
public someOtherGlobalValue: number = 6;
}
@Component({
selector: 'app',
providers: [GlobalSettings]
template: '<div> This is the template placeholder </div>'
})
export class App {
constructor (private globalSettings: GlobalSettings) {}
}
Now, note the line `providers: [GlobalSettings]` there. When you add a provider like that, then the current component and all of the child components will share the same instance of the global settings. And since this is the main component, global service is shared among all the other components (unless they override it for themselves).
Now, you obviously wanna move the global settings to it's own file, right?
So you have global-settings.ts:
export class GlobalSettings {
}
Then Angular2 will "provide" your App component and it's descendants an instance of the component:
import { Component } from 'angular2/core';
// import the settings
import { GlobalSettings } from './global-settings';
import { SubComponent } from './subcomponent';
@Component({
selector: 'app',
providers: [GlobalSettings]
template: '<subcomponent></subcomponent>',
directives: [SubComponent]
})
export class App {}
Note how the App doesn't even have to use the settings, just provide it.
Then your subcomponent simply asks for the instance in it's constructor:
import { Component } from 'angular2/core';
// import the settings
import { GlobalSettings } from './global-settings'
@Component({
selector: 'subcomponent',
template: '<div>We'll be connecting to {{ backendUrl }}</div>'
})
export class SubComponent {
public backendUrl: string;
constructor(private globalSettings: GlobalSettings) {
this.backendUrl = globalSettings.backendUrl;
}
}
So far, so good. But what if you want to update those global settings from around the app?
Let's say one component updates a value, another one reacts to them? Use an Observable.
import { Observable } from 'rxjs/Observable';
export class GlobalSettings {
// Our monitored shared global value
// An Observable object that other components will subscribe to if they want
// updates
public globalValue$: Observable<string>;
// And here we'll shoot updates from.
private observer: any; // I don't know the proper type for this.
constructor() {
this.globalValue$ = new Observable(observer => this.observer = observer);
}
// When a component wants to update the value, come in here.
public updateValue(value) {
// just retransmit the value. Alternatively you can check if it matches one
// of desired values, if the caller has the correct authorization or similar.
// We also need to check if there _is_ an observer. If nobody subscribed to
// the observable, the observer would not exist and this would error out.
if (this.observer) {
this.observer.next(value);
}
}
}
Now, the usage is simple:
// the component that wants to listen to changes
class ListeningComponent {
constructor(private globalSettings: GlobalSettings) {
this.globalSettings.globalValue$.subscribe(newValue => console.log(`New global value: ${newValue}.`));
}
}
// The component that wants to make updates, even if it's the same one:
this.globalSettings.updateValue('new value here');
You would also use the similar pattern if you want to asynchronously update the global state (e.g. read initial values from a config.json or remote server) - an observer that emits those values.
Anyway, hope that helps.