Próbuję osiągnąć coś takiego: Mam klasy modelu o nazwie ObjectTypeA
, ObjectTypeB
i ObjectTypeC
. Istnieje również fabryka ComponentFactory
, który w zależności od rodzaju obiektu przekazany w stworzy różne składniki:Dynamiczny szablon "transclusion" w Angular2
ComponentFactory.ts
export interface ComponentFactoryInterface {
static CreateComponent(obj: CommonSuperObject)
}
@Injectable()
export class ComponentFactory {
public static CreateComponent(obj: CommonSuperObject){
if (obj instanceof ObjectTypeA){
return ObjectComponentA()
}else if (obj instanceof ObjectTypeB){
return ObjectComponentB()
}
}
}
W szablonie chciałbym zrobić coś takiego:
main_template.html
<components>
<component *ngFor="#obj in objects">
<!-- insert custom component template here -->
</component>
</components>
Jak dynamicznie wstawiać powiązane komponenty?
mógłby zrobić coś takiego (nie mój preferowany sposób to zrobić):
<components>
<!-- loop over component models -->
<custom-component-a *ngIf="models[i] instanceof ObjectTypeA">
</custom-component-a>
<custom-component-b *ngIf="models[i] instanceof ObjectTypeB">
</custom-component-b>
</components>
Ale to wydaje się naprawdę źle mi się na wielu płaszczyznach (będę musiał zmodyfikować ten kod i kod fabryczny jeśli dodaję inny typ komponentu).
Edit - Przykład roboczy
constructor(private _contentService: ContentService, private _dcl: DynamicComponentLoader, componentFactory: ComponentFactory, elementRef: ElementRef){
this.someArray = _contentService.someArrayData;
this.someArray.forEach(compData => {
let component = componentFactory.createComponent(compData);
_dcl.loadIntoLocation(component, elementRef, 'componentContainer').then(function(el){
el.instance.compData = compData;
});
});
}
'ngSwitch' nie jest opcją,' DynamicComponentLoader' brzmi bardziej jak to, czego szukam. Przyjrzę się temu i wrócę do ciebie. –
Uff! Prawie na tym etapie wystarczy ustawić właściwość na nowo utworzonym komponencie. Dostaję obietnicę z 'ComponentRef' powrotem, ale nie jestem pewien, jak uzyskać dostęp do właściwości nowo załadowanego składnika ... Dowolny pomysł? (Zaktualizowałem moje pytanie, aby zobaczyć, z czym pracuję) –
OK, myślę, że instancja składnika byłaby "el.instance". Próbuję tego i wkrótce się z tobą skontaktuję. –