Angular 2 Global Constants Provider Injector Method

后端 未结 3 1986
谎友^
谎友^ 2021-02-20 05:36

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

相关标签:
3条回答
  • 2021-02-20 05:51
    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

    0 讨论(0)
  • 2021-02-20 05:58

    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.

    0 讨论(0)
  • 2021-02-20 06:02
    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/'
        }
      }
    

    Plunker


    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;
      }
    
    }
    

    Plunker

    0 讨论(0)
提交回复
热议问题