Ionic 动态创建的组件作为同级添加

6fe3ivhb  于 2023-04-27  发布在  Ionic
关注(0)|答案(2)|浏览(145)

我正在做一个Ionic/Angular项目,我试图动态地将组件添加到页面中。为了创建组件,我使用了Angulars ComponentFactoryResolver。当将组件添加到视图中时,它们被添加为目标容器的兄弟容器,而不是子容器。

instrument.page.ts

@Component({
    selector: 'app-instruments',
    templateUrl: './instruments.page.html',
    styleUrls: ['./instruments.page.scss'],
})
export class InstrumentsPage implements AfterViewInit {

    instruments: Instrument[];

    @ViewChild('instrumentscontainer', { read: ViewContainerRef }) entry: ViewContainerRef;

    constructor(
        private data: DataService,
        private resolver: ComponentFactoryResolver
    ) {
        this.instruments = data.getInstruments();
    }

    ngAfterViewInit() {
        this.createComponents();
    }

    createComponents() {
        this.entry.clear();
        const factory = this.resolver.resolveComponentFactory(InstrumentCardComponent);
        this.data.getData().forEach((organization: Organization) => {
            organization.getGroups().forEach((group: Group) => {
                group.getFields().forEach((field: Field) => {
                    field.getInstruments().forEach((instrument: Instrument) => {
                        let component = this.entry.createComponent(factory);
                        component.instance.instrument = instrument;
                        component.instance.field = field;
                        console.log(component);
                    });
                });
            });
        });
    }
}

instrument.page.html

<ion-content #instrumentscontainer>
</ion-content>

ki1q1bka

ki1q1bka1#

我解决这个问题的方法是

<ng-container #instrumentcontainer></ng-container>

在我所理解的ion-content元素内部,在运行时从DOM中删除。

izj3ouym

izj3ouym2#

我遇到了同样的问题,我发现我没有引用@ViewChild装饰器上的容器。所以我有一个没有定义为入口点的容器。
在上面的例子中,我没有视图:ViewContainerRef元素,所以它总是在容器外部加载(它在元素外部创建一个新容器)。我使用以下命令解决了这个问题:

@ViewChild('ref', { read: ViewContainerRef, static: true }) entry: ViewContainerRef;

然后在加载组件时,

const componentRef = this.entry.createComponent(ShipmentDetailsComponent);

在模板中

<ng-container #ref></ng-container>

希望这对某人有帮助。

相关问题