Есть ли способ расширить конструктор дочернего компонента новым классом Injection без необходимости вызывать super ()? - PullRequest
2 голосов
/ 29 января 2020

В пределах Angular у меня есть дочерний компонент, который наследуется от родительского компонента. Этот родительский компонент внедряет несколько классов. Я хочу расширить дочерний компонент с помощью класса инъекций, который я не использую в родительском классе. До этого расширения не требовалось создавать экземпляр конструктора и вызывать super( *args* ). Когда я пытаюсь расширить конструктор, я получаю следующее сообщение об ошибке:

Конструкторы для производных классов должны содержать супер вызов

Есть ли способ не быть обязанным вызывать суперкласс при расширении класса с помощью инъекции? Дайте мне знать, если что-то не понятно по этому вопросу.

Родительский компонент

@Component({ template: '' })
export abstract class ParentComponent<T> implements OnInit, OnDestroy {

  constructor(
    protected formBuilder: FormBuilder,
    protected route: ActivatedRoute,
    protected snackBar: MatSnackBar,
    protected location: Location
  ) {
    const routeParams = this.route.snapshot.params;
    if (routeParams && routeParams.id) {
      this.subjectId = this.route.snapshot.params.id;
    }
  }
}

Дочерний компонент

export class ChildComponent extends ParentComponent<MyT> {
  constructor(
    /** I want to extend with the following service */
    protected myService: Service
  ) {
       // But as I instantiate this constructor, I also need to call super() with the required params
  }
}

Расширение вопроса

Чтобы расширить мой вопрос; Я не уверен, что этот двойной импорт параметров суперкласса и его передача являются накладными. Основная причина этого вопроса заключается в том, что я стараюсь сохранить код как можно более чистым и пытаюсь преодолеть дублирующийся код. Двойной импорт классов инъекций ради предоставления его в вызове super кажется немного бесполезным.

Ответы [ 2 ]

2 голосов
/ 29 января 2020

Полагаю, ты боишься вводить все вещи своему родителю. Вот почему вам нужно такое поведение. Боюсь, что нет такой опции с angular DI. Лучшее, что вы можете сделать - это общий стиль для всех компонентов, чтобы внедрить Injector вместо его зависимостей, а затем получить все зависимости через инжектор.

 class Parent {
   private myService = this.injector.get(MyService)
     private myService2 = this.injector.get(MyService2)
   constructor(@Inject(INJECTOR) injector: Injector){}
}
class Child extends Parent {
 constructor(@Inject(INJECTOR) injector: Injector) {
 super(injector);
  }
}

, если Parent не является компонентом во всех этих случаях вы можете опустить @Inject(INJECTOR) в его конструкторе

1 голос
/ 29 января 2020

Прочитав ваш вопрос несколько раз, я не уверен, что это понятно, поэтому я опубликую его как ответ.

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

Конструктор вашего ребенка должен выглядеть следующим образом:

constructor(
  formBuilder: FormBuilder,
  route: ActivatedRoute,
  snackBar: MatSnackBar,
  location: Location,
  protected myService: Service // note the "protected" here but not above
) {
  super(formBuilder, route, snackBar, location);
}

Не- protected аргументы дочернего конструктора, по сути, являются «проходными», так сказать, декларациями вашего родителя о том, что должно быть введено. Ничто не вводится дважды или что-то в этом роде.

...