Angular 5 Dependency Injection - есть ли другой способ, кроме использования constructor ()?

У меня есть служба, объявленная в моем файле module.ts, которая имеет охват всего приложения. Способ доступа к экземпляру этой службы состоит в том, чтобы объявить его как часть конструктора для класса компонента, например так, и фреймворк автоматически подключает его:

export class ComponentBase implements OnInit {

  constructor(private myService: MyService) { }
}

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

Итак, есть ли другой, более надежный способ сделать это в базовом классе?

Я не совсем понимаю, что вы пытаетесь сделать. Если вы хотите, чтобы все производные классы имели доступ к службе, вы можете объявить ее как protected в конструкторе базового класса.

ConnorsFan 16.05.2018 00:11

@ConnorsFan Неважно, protected или private, он не будет существовать, пока производный класс не сможет вызвать конструктор super(...).

theMayer 16.05.2018 00:12

Но конструктор базового класса будет вызываться, если у производного класса нет конструктора. Вы говорите о производных классах с конструктором, но где super(...) не вызывается?

ConnorsFan 16.05.2018 00:24

@ConnorsFan - видимо, дело не в этом. Если в производном классе нет конструктора, конструктор базового класса не вызывается. Я подтвердил это через console.info. Изначально я думал иначе, поэтому мне потребовалось много времени, чтобы найти ошибку.

theMayer 16.05.2018 00:25

Не знаю, как вы это реализовали, но работает. Взгляните на этот stackblitz, где HelloComponent является производным от BaseComponent.

ConnorsFan 16.05.2018 00:37

Я посмотрю еще раз, но наш сайт не работает на Stackblitz. Это похоже на ошибку в Angular, TypeScript или веб-пакете.

theMayer 16.05.2018 00:51

Могу добавить, что я без проблем использую такой производный класс компонентов в своих проектах (Angular 5 + webpack). Сервисы, помеченные как protected, доступны в производных классах.

ConnorsFan 16.05.2018 00:53

Я ожидал, что это сработает, и был очень удивлен, когда этого не произошло. Создание конструктора с вызовом super () решило мою проблему.

theMayer 16.05.2018 00:54

@theMayer Ваш ComponentBase в коде выше неextends Component. Может быть, в этом проблема? Когда я удаляю это из созданного StackBlitz @ConnerFan, все перестает работать.

R. Richards 16.05.2018 01:03

Он должен расширять компонент?

theMayer 16.05.2018 01:35

Я использую extends Component в своем коде (не помню, зачем мне это пришлось делать изначально). Теперь я вижу, что могу удалить его из stackblitz, и он будет работать, если я также удалю вызов super() в конструкторе BaseComponent.

ConnorsFan 16.05.2018 02:04
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
11
54
1

Ответы 1

Инъекции предоставляются как параметры конструктора: - вы можете установить класс напрямую, например:

constructor(private myService: MyService)
  • или с помощью инжектора:

    конструктор (инжектор: Инжектор) { this.myService = инжектор.get (MyService); }

Другие вопросы по теме