Внедрить услугу вручную

У меня есть компоненты B, C, D которые наследуются от класса A

Я хочу использовать сервис в классе A, но я не знаю, как внедрить его, не вводя его от своих детей.

То, что я пробовал, - это обычное внедрение: constructor(pageName: string = null, translate: TranslateService) { Но когда я делаю super() для создания класса A, выдается ошибка, потому что я не предоставил второй параметр.

Есть ли способ внедрить в родительский класс, используя Angular 2?

Версия Angular, которую я вынужден использовать: 2.2.1

РЕДАКТИРОВАТЬ:

Несколько примеров: у меня много страниц, на каждой из которых может отображаться загрузчик. Вместо того, чтобы вводить загрузчик каждый раз и управлять загрузчиком с каждой страницы, я хочу сделать:

export class BaseComponent {
    constructor(private loader: LoadingService) {}

    showLoading() {
        this.loader.show();
    }
}

А потом наследовать от самого компонента:

@Component({
    selector: "page-login",
    providers: [UsersService],
    templateUrl: "login.html"
})
export class LoginPage extends BaseComponent {
    constructor(private usersService: UsersService) {
        super();
    }
}

Теперь у LoginPage есть метод showLoading от него parent.

Ответ 1

Вы можете решить эту проблему с помощью службы поиска услуг. Это легко позволит вам получить любую услугу и использовать ее в ваших родительских классах, не вводя их через своих детей (это может быть проблемой).

Чтобы использовать это, создайте простой класс locator.service.ts:

import {Injector} from "@angular/core";

export class ServiceLocator {
    static injector: Injector;
}

Импортируйте этот сервис в свой app.module.ts:

import {ServiceLocator} from './locator.service';

Затем в конструкторе файла вашего модуля (app.module.ts?) запустите эту вещь, чтобы ее можно было использовать где угодно:

export class AppModule {
    constructor(private injector: Injector){    // Create global Service Injector.
        ServiceLocator.injector = this.injector;
    }
}

Теперь, чтобы использовать его в своем суперклассе (вашем BaseComponent), просто импортируйте ServiceLocator

import {ServiceLocator} from './locator.service';

и используйте его как:

export class BaseComponent {
    public loader;
    constructor() {
        this.loader = ServiceLocator.injector.get(LoadingService)
    }

    showLoading() {
        this.loader.show();
    }
}

Теперь вы внедрили свой сервис в расширяемый родительский элемент, и его можно использовать в дочерних компонентах, не передавая его в super().