javascript - Hvordan laste komponenter dynamisk i Angular 12
Veien jeg lærte her i Angular-dokumentasjonen, er å kalle createComponent() på en containerreferanse.
I stedet for å bruke et input som i eksemplet, importerer jeg en komponent og prøver å sende den direkte, fordi det også i dokumentasjonen står:
Angular krever ikke lenger komponentfabrikker for å dynamisk opprette komponenter. Bruk en annen signatur av createComponent-metoden, som lar deg sende inn komponentklassen direkte.
Men hvorfor klager kompilatoren min da? Etter min forståelse av spesifikasjonen, er følgende den anbefalte løsningen.
loadMore() {
const viewContainerRef = this.resultArea.viewContainerRef;
const componentRef = viewContainerRef.createComponent<RecentGridComponent>(RecentGridComponent);
}
Men jeg får
Argument av typen 'typeof RecentGridComponent' kan ikke tilordnes til parameter av typen 'ComponentFactory'. Typen 'typeof RecentGridComponent' mangler følgende egenskaper fra typen 'ComponentFactory': selector, componentType, ngContentSelectors, inputs, og 2 til. ts(2345)
I stedet måtte jeg instantiere en fabrikk (full kode)
import { Component, ComponentFactoryResolver, OnInit, ViewChild } from '@angular/core';
import { RecentGridComponent } from '../recent-grid/recent-grid.component';
import { ResultAreaDirective } from '../result-area.directive';
@Component({
selector: 'app-search-filters',
templateUrl: './search-filters.component.html',
styleUrls: ['./search-filters.component.sass']
})
export class SearchFiltersComponent implements OnInit {
@ViewChild(ResultAreaDirective) resultArea!: ResultAreaDirective
constructor(private resolver: ComponentFactoryResolver) { }
ngOnInit(): void {
}
loadMore() {
const viewContainerRef = this.resultArea.viewContainerRef;
const factory = this.resolver.resolveComponentFactory(RecentGridComponent)
const componentRef = viewContainerRef.createComponent<RecentGridComponent>(factory)
}
}
Svar #1
Som påpekt av yurzui, er den riktige spesifikasjonen for v12 her
For å bestå klassen direkte, bør man bruke v13.