Загрузчик динамических компонентов - Невозможно прочитать свойство viewContainerRef из undefined

Я следую всем шагам руководства по рекламным баннерам на Angular.io. Но в конце после всех настроек я получаю сообщение об ошибке от этого компонента и функции:

Ad-banner.component TS

loadComponent() {
    this.currentAdIndex = (this.currentAdIndex + 1) % this.ads.length;
    const adItem = this.ads[this.currentAdIndex];

    const componentFactory = this.componentFactoryResolver.resolveComponentFactory(adItem.component);

    const viewContainerRef = this.adHost.viewContainerRef; ---->ERROR comes from this Line
    viewContainerRef.clear();

    const componentRef = viewContainerRef.createComponent(componentFactory);
    (<AdComponent>componentRef.instance).data = adItem.data;
  }

Я получаю журнал правильно, данные о героях поступают в домашний компонент, где я показываю рекламу, но не с ошибкой, так может ли кто-нибудь со мной разобраться?

ИЗМЕНИТЬ Основную директиву

import { Directive, ViewContainerRef } from '@angular/core';

@Directive({
  selector: '[ad-host]'
})
export class AdDirective {

  constructor(public viewContainerRef: ViewContainerRef) { }

}

person Mellville    schedule 29.05.2020    source источник
comment
Когда вы вызываете эту функцию? Его следует вызывать в AfterViewInit или позже.   -  person Tony Marko    schedule 29.05.2020
comment
его onInit, как в документации, но я попробую ваше предложение   -  person Mellville    schedule 29.05.2020
comment
this.adHost не определен при вызове loadComponent (). Откуда вызывается loadComponent ()?   -  person ukn    schedule 29.05.2020
comment
конструктор (общедоступный viewContainerRef: ViewContainerRef) {} есть это в коде?   -  person Aakash Garg    schedule 29.05.2020
comment
@ Аакаш Гарг Айв отредактировал сообщение, да, это есть в Директиве   -  person Mellville    schedule 29.05.2020
comment
@Mellville, что в тексте ошибки?   -  person Tony Marko    schedule 29.05.2020
comment
опубликовал свой ответ ниже.   -  person Aakash Garg    schedule 29.05.2020
comment
Вы объявили свою директиву в app.module?   -  person Tony Marko    schedule 29.05.2020


Ответы (1)


HTML-код вашего компонента должен быть: -

<div class="ad-banner-example">
              <h3>Advertisements</h3>
              <ng-template ad-host></ng-template>
            </div>

Ваш компонент Ts должен иметь: -

@ViewChild(AdDirective, {static: true}) adHost: AdDirective;

У вас должен быть AdhostDirective в объявлениях вашего модуля.

и вы должны вызывать this.loadComponent (); в ngoninit.

person Aakash Garg    schedule 29.05.2020
comment
все на месте, декларации, входные компоненты - person Mellville; 29.05.2020
comment
а директива внутри объявлений в модуле? - person Aakash Garg; 29.05.2020