Angular 9 Load Dynami c компонентов с viewContainerRef получает неопределенный результат - PullRequest
0 голосов
/ 19 июня 2020

Я создал приложение, которое использует представления внутри представлений, и у меня возникают проблемы с перемещением моего кода в библиотеки, а затем с предоставлением общего доступа к нему. загрузить компонент для просмотра. Все мои страницы имеют общий компонент навигации, который предоставляет строку заголовка, боковое меню, автоматическое скрытие, изменение размера и т. Д. c. С помощью наблюдаемых объектов.

Таким образом, моя маршрутизация имеет основной путь к NavigationComponent, это простая Angular схема навигации по материалам c. Затем у него есть выход маршрутизатора, который затем будет отображать мой целевой компонент.

Мои основные страницы - это схемы панели управления материалами. На них показаны карточки с информацией и маршрутизация по стандартным URL-адресам для загрузки фактического компонента.

Например, на моей домашней странице есть навигация, а затем ряд карточек для отображения различных данных (о сайте, событиях, новостях и т. Д. c.)

const routes:Routes = [
    { path: '', component: NavigationCommonComponent,
        children: [
            { path: '', component: HomeComponent },
            { path: 'aboutus', component: AboutComponent },
            { path: 'events', component: EventsComponent },
            { path: 'news', component: NewsComponent },
        ]
    }
];

Приведенная выше базовая маршрутизация c может дать некоторую информацию. Когда это просто карточки, все работает нормально. Я переместил карточки в библиотеку, и данные могут отображаться на карточке. Сейчас я пытаюсь показать содержимое компонентов в данных карты.

Например, если карта была жестко запрограммирована, вы бы использовали

<mat-card>
    <appEvents></AppEvents>
</mat-card>

Затем это будет использовать EventsController для отображения всего, что находится на карточке. Жестко запрограммировано, это работает. Сейчас я пытаюсь использовать те же примеры viewComponentRef из документов Angular 9, чтобы эти карты загружались динамически.

Например, теперь у меня есть массив данных с компонентом ( Тип) как элемент для просмотра. У меня есть компонент карты

. Я использовал AdService из примеров:

@Injectable()
export class AdService {
    public getAds() {
        return [
            new AdItem(HeroJobAdComponent, {name: 'Bombasto', bio: 'Brave as they come'}),
            new AdItem(HeroJobAdComponent, {name: 'Dr IQ', bio: 'Smart as they come'}),

        ];
    }
}

HeroJobAdComponent

@Component({
template: `
    <div class="job-ad">
    <h4>{{data.headline}}</h4>

    {{data.body}}
    </div>
`
})
export class HeroJobAdComponent implements AdComponent {
@Input() public data:any;

}

и предоставленная директива.

@Directive({
selector: '[appAdHost]',
})
export class AdDirective {
constructor(public viewContainerRef:ViewContainerRef) { }
}

Кажется, все правильно, за исключением того, что когда код запущен, viewContainerRef из ViewChild:

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

кажется пустым в строке const viewContainerRef = this.adHost.viewContainerRef;. AdHost не определен.

public 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;
    viewContainerRef.clear();

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

Я считаю, что это связано с уровнями компонентов, где у меня есть список сеток / карточек (схема панели материалов c) в качестве дочернего элемента моего навигационного компонента . Я не знаю, как сделать так, чтобы этот элемент не был неопределенным.

1 Ответ

1 голос
/ 09 июля 2020

удалить свойство read: ViewContainerRef.

...