У меня есть служба, объявленная в моем файле module.ts, которая имеет охват всего приложения. Способ доступа к экземпляру этой службы состоит в том, чтобы объявить его как часть конструктора для класса компонента, например так, и фреймворк автоматически подключает его:
export class ComponentBase implements OnInit {
constructor(private myService: MyService) { }
}
Мой класс компонента является одним из нескольких похожих компонентов, поэтому все они имеют общий базовый класс, и этот конструктор находится в основе. Я обнаружил, что базовые конструкторы не требуются автоматически, поэтому возможно, что производный класс окажется без конструктора (и без зависимости).
Итак, есть ли другой, более надежный способ сделать это в базовом классе?
@ConnorsFan Неважно, protected или private, он не будет существовать, пока производный класс не сможет вызвать конструктор super(...).
Но конструктор базового класса будет вызываться, если у производного класса нет конструктора. Вы говорите о производных классах с конструктором, но где super(...) не вызывается?
@ConnorsFan - видимо, дело не в этом. Если в производном классе нет конструктора, конструктор базового класса не вызывается. Я подтвердил это через console.info. Изначально я думал иначе, поэтому мне потребовалось много времени, чтобы найти ошибку.
Не знаю, как вы это реализовали, но работает. Взгляните на этот stackblitz, где HelloComponent является производным от BaseComponent.
Я посмотрю еще раз, но наш сайт не работает на Stackblitz. Это похоже на ошибку в Angular, TypeScript или веб-пакете.
Могу добавить, что я без проблем использую такой производный класс компонентов в своих проектах (Angular 5 + webpack). Сервисы, помеченные как protected, доступны в производных классах.
Я ожидал, что это сработает, и был очень удивлен, когда этого не произошло. Создание конструктора с вызовом super () решило мою проблему.
@theMayer Ваш ComponentBase в коде выше неextends Component. Может быть, в этом проблема? Когда я удаляю это из созданного StackBlitz @ConnerFan, все перестает работать.
Он должен расширять компонент?
Я использую extends Component в своем коде (не помню, зачем мне это пришлось делать изначально). Теперь я вижу, что могу удалить его из stackblitz, и он будет работать, если я также удалю вызов super() в конструкторе BaseComponent.





Инъекции предоставляются как параметры конструктора: - вы можете установить класс напрямую, например:
constructor(private myService: MyService)
или с помощью инжектора:
конструктор (инжектор: Инжектор) { this.myService = инжектор.get (MyService); }
Я не совсем понимаю, что вы пытаетесь сделать. Если вы хотите, чтобы все производные классы имели доступ к службе, вы можете объявить ее как
protectedв конструкторе базового класса.