I have a global constants like root directory that I want every component to have access to. In another stackoverflow question the answer was to create a constants class and imp
import {Component,bind,provide} from 'angular2/core';
import {bootstrap} from 'angular2/platform/browser';
import {FORM_DIRECTIVES} from 'angular2/form';
import {Directive, ElementRef, Renderer, Input,ViewChild,AfterViewInit} from 'angular2/core';
import {Constants} from 'src/constants'
import {ViewChild, Component, Injectable} from 'angular2/core';
@Component({
selector: 'my-app',
template: `{{test}}`,
})
export class App {
test: string;
constructor(cs:Constants){
this.test = cs.root_dir;
}
}
bootstrap(App, [Constants]);
Demo
To answer your questions:
All components using the Constants class will need to import your constants file.
In order to use the Constants class you need to inject it into the constructor of any consuming components, removing the injector.get() function from random.component.ts like so:
export class App {
constructor(constants: Constants) {
this.url = constants.root_dir;
}
}
You may also decorate your constant class as an @Injectable
and @Inject
it into the constructor of your component.
Here is a working plunker.
It is beneficial to bootstrap the shared constants at the app level so that only one instance of the class is created and shared among all components.
import {Component} from 'angular2/core'
import { Constants } from './constants'
@Component({
selector: 'test',
template: `
Constants: <strong>{{ urlTemplate }}</strong>
`
providers:[Constants]
})
export class AppComponent{
constructor(constants: Constants){
this.urlTemplate = constants.root_dir;
}
}
You can use adding Constants
in providers:[Constants]
The decorator @Injectable It is not necessary in this case, but Google recommends always use You can see here: https://angular.io/docs/ts/latest/guide/dependency-injection.html#!#why-injectable-
/*
We recommend adding @Injectable() to every service class, even those that don't have dependencies and, therefore, do not technically require it. Here's why:
Future proofing: No need to remember @Injectable when we add a dependency later.
Consistency: All services follow the same rules, and we don't have to wonder why a decorator is missing
*/
//@Injectable()
export class Constants{
root_dir: string;
constructor(){
this.root_dir = 'http://google.com/'
}
}
About @Inject used, you can read something here: what is the difference between using (@Inject(Http) http: Http) or not
Now if you want this globally can add in bootstrap
//main entry point
import {bootstrap} from 'angular2/platform/browser';
import {AppComponent} from './app';
import { Constants } from './constants';
bootstrap(AppComponent, Constants)
.catch(err => console.error(err));
//import { Injectable } from 'angular2/core'
//@Injectable()
export class Constants{
root_dir: string;
constructor(){
this.root_dir = 'http://google.com/'
}
}
import {Component, Inject} from 'angular2/core'
import { Constants } from './constants';
@Component({
selector: 'test',
template: `
Constants: <strong>{{ urlTemplate }}</strong>
`
})
export class AppComponent{
constructor(@Inject (Constants) constants: Constants){
this.urlTemplate = constants.root_dir;
}
}