2016-11-02 6 views
0

Ich bin mit dem folgenden Spinner aus dem ng2-admin Thema:Mit Spinnern als globaler Service

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

@Injectable() 
export class BaThemeSpinner { 

    private _selector:string = 'preloader'; 
    private _element:HTMLElement; 

    constructor() { 
    this._element = document.getElementById(this._selector); 
    } 

    public show():void { 
    this._element.style['display'] = 'block'; 
    } 

    public hide(delay:number = 0):void { 
    setTimeout(() => { 
     this._element.style['display'] = 'none'; 
    }, delay); 
    } 
} 

Also für jede Komponente ich es importieren müssen, und ich will, es zu vermeiden, da viele Komponenten es verwenden werden. Wie kann ich es der gesamten Anwendung zur Verfügung stellen?

+0

Das Importieren von jedem Verbraucher hat einige Vorteile, die hauptsächlich die Abhängigkeit aufrufen. Stellen Sie sich vor, Sie suchen und ersetzen dieses später ohne die Zeile "import {SpinnerService} from ...". – ssube

+0

Aber der Spinner-Service speziell in einer App ist in der Regel für alle Komponenten gleich. Wenn es sich ändert, dann würde die ganze App aktualisiert werden. – FacundoGFlores

Antwort

1

Sie können eine Basiskomponente erstellen und setzen einen Getter wie

export class BaseView { 

    protected _injector:Injector; 

    protected _spinnerService:SpinnerService; 

    constructor() { 
     let providers = ReflectiveInjector.resolve([SpinnerService]); 
     this._injector = ReflectiveInjector.fromResolvedProviders(providers); 
    } 

    get spinnerService(): SpinnerService { 
     if (this._spinnerService == null) { 
      this._spinnerService = this._injector.get(SpinnerService); 
     } 
     return this._spinnerService; 
    } 
} 

dann verwenden:

this.spinnerService.show() 

ReflectiveInjector kann innerhalb von @ Winkel/Kern

finden

Text: https://angular.io/docs/ts/latest/api/core/index/ReflectiveInjector-class.html

+0

was appInjector ist? Woher importierst du es? – FacundoGFlores

+0

@FacondoGFlores 'Import {Injector} von '@ angular/core';' –

+0

@FacondoGFlores Ich habe die Antwort aktualisiert, denken Sie daran, dies ist ein Service-Locator-Muster, nur zu Ihrer Information. –

Verwandte Themen