Ответ 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().