FacundoGFlores FacundoGFlores - 22 days ago 14
TypeScript Question

Using spinner as global service

I am using the following spinner from the ng2-admin theme:

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


So for each component I have to import it, and I want to avoid it, because many components will use it. How can I make it available to the whole application?

Answer

You can create a base component and put a getter like

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

then use it:

this.spinnerService.show()

ReflectiveInjector can be found inside of @angular/core

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