Наследование с ViewChild Angular 8

Я пытаюсь сделать наследование с классом, но если я использую ViewChild, я всегда получаю неопределенность. Я собираюсь показать упрощение моей проблемы.

У меня есть родительский класс:

@Component({
  selector: 'parent',
  template: `<h1>Hello {{name}}!</h1> <p #pRef>`,
  styles: [`h1 { font-family: Lato; }`]
})
export class ParentComponent  {
  name: string;
  @ViewChild('pRef') public pRef: ElementRef;

  ngOnInit{
    console.log(this.pRef.nativeElement);
  }
}

И затем у меня есть ребенок, которому я хочу переопределить имя, например:

@Component({
  selector: 'child',
  templateUrl: '<div></div>',
  styleUrls: [ './app.component.css' ]
})
export class ChildCOmponent extends ParentComponent {

name = 'Juan';

}

Как я уже говорил, это упрощение моей проблемы, но я получаю ту же ошибку, что и:

ОШИБКА Ошибка: невозможно прочитать свойство 'nativeElement' неопределенного

Мне нужен доступ к ViewChild в родительском, а в дочернем мне это не нужно, но я получаю сообщение об ошибке, потому что в дочернем компоненте pRef не существует.

Как я могу использовать ViewChild и наследование одновременно?


person SantiSori    schedule 18.02.2020    source источник
comment
Проверьте это: stackoverflow.com/questions/42049792/   -  person Prashant Pimpale    schedule 18.02.2020
comment
Или это: stackoverflow.com/a/51124486/7124761   -  person Prashant Pimpale    schedule 18.02.2020
comment
@PrashantPimpale да, проблема в том, что мне нужно использовать наследование, а не услуги, и это не проблема жизненного цикла.   -  person SantiSori    schedule 18.02.2020
comment
Я могу ошибаться, но расширение компонентов кажется нетрадиционным. Чего вы пытаетесь добиться этим?   -  person Adam Dunkerley    schedule 18.02.2020
comment
используйте 1_   -  person Julius    schedule 18.02.2020
comment
@AdamDunkerley да, теперь это не типично для Angular, но я собираюсь использовать один и тот же компонент несколько раз, и я не хочу иметь несколько @ Input, я предпочитаю наследование.   -  person SantiSori    schedule 18.02.2020
comment
@julius-dzidzevičius julius-dzidzevičius, а если я хочу сослаться на свой ViewContainerRef в классе INHERITED? Проблема здесь, поскольку декораторы не наследуют...   -  person Alexander    schedule 17.11.2020
comment
вы можете использовать пустой декоратор @Directive angular.io/guide/migration-undecorated-classes   -  person Chi    schedule 20.11.2020


Ответы (1)


Проблема в том, что html шаблон не наследуется. В вашем дочернем классе есть шаблон, и в нем нет #pRef. С другой стороны, если вы получите доступ к нему в родительском классе, вы получите ElementRef.

Вероятно, хорошим обходным путем будет прямой доступ к HTMLElement с помощью document.getElementById. Насколько мне известно, Angular не допускает наследования HTML-шаблонов для компонентов.

person KKulitskiy    schedule 11.02.2021