Angular 9 Ivy entryКомпоненты конвертации - PullRequest
0 голосов
/ 20 марта 2020
@Component({
   selector: 'dynamic',
   template: '<ng-template *ngFor="let portal of portals" [cdkPortalOutlet]="portal"></ng-template>',
   // entryComponents before Ivy
   entryComponents: [Component1, Component2, Component3]
})
class DynamicComponent<T extends BaseComponentClass>() {
    portals: ComponentPortal<any>[] = [];

    constructor(@Inject(COMPONENTS_TOKEN) components: T[]) {
        // Something like this
        this.portals = components.map(c => new ComponentPortal(c));
    }
}

@NgModule({
    declarations: [
        DynamicComponent
        Component1,
        Component2,
        Component3,
    ],
    imports: [PortalModule, CommonModule, MyOtherModule]
})

У меня есть компонент, описанный выше, который я создаю динамически, используя ComponentPortal и cdkPortalOutlet. Сам DynamicComponent имеет множество точек и компонентов, которые он создает. Ранее с entryComponents я бы перечислял каждый компонент, который мог быть загружен в DynamicComponents выходы. Это работало, как и ожидалось, но теперь после обновления до Ivy и удаления устаревшего entryComponents это больше не работает. Я создаю DynamicComponent, и он прекрасно инициализируется, но компоненты внутри DynamicComponent, похоже, не создаются и вызывают весь DynamicComponent сбой при его рендеринге. Если я удаляю выходы в DynamicComponent, то все остальное в DynamicComponent отображается нормально.

Я думаю, что компоненты зависимости DynamicComponent не разрешаются при его создании. Компоненты зависимости не используются ни в каких других angular компонентах. Я что-то упускаю из-за того, как преобразовать старое поведение entryComponent для работы с Ivy?

EDIT: "buildOptimizer": false исправляет это, но в идеале хочет оставить это включенным.

1 Ответ

0 голосов
/ 22 апреля 2020

Вы можете создать массив entryComponents в своем классе DynamicComponent, где вы перечисляете компоненты, на которые нет ссылок в других местах, например:

class DynamicComponent<T extends BaseComponentClass>() {
    entryComponents = [Component1, Component2, Component3];
    ...

Тот факт, что на компоненты ссылаются, не позволяет им будучи потрясенным деревом, хотя переменная ни для чего не используется. См. Интересное обсуждение проблемы такого рода и возможное решение по этому вопросу Angular GitHub .

...