Sto cercando di ottenere qualcosa del genere: Ho una classe di modello chiamata ObjectTypeA
, ObjectTypeB
e ObjectTypeC
. C'è anche una fabbrica ComponentFactory
, che in base al tipo di oggetto passato in creerà diverse componenti:Modello dinamico "transclusione" in 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()
}
}
}
Nel modello vorrei fare qualcosa di simile a questa:
main_template.html
<components>
<component *ngFor="#obj in objects">
<!-- insert custom component template here -->
</component>
</components>
Come si inseriscono dinamicamente i componenti associati?
ho potuto fare qualcosa di simile (non è il mio modo preferito di farlo):
<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>
Ma questo è sembra davvero sbagliato a me su molti livelli (avrei dovuto modificare il codice e il codice di fabbrica se aggiungo un altro tipo di componente).
Edit - Esempio di lavoro
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' non è un'opzione,' DynamicComponentLoader' suona più come quello che sto cercando. Daro 'un'occhiata a questo e torno da te. –
Phew! Quasi lì, ho solo bisogno di impostare una proprietà sul componente appena creato. Ricevo la promessa con 'ComponentRef' ma non sono sicuro di come accedere alle proprietà del componente appena caricato ... Qualche idea? (Ho aggiornato la mia domanda per vedere con cosa sto lavorando) –
Ok, penso che l'istanza del componente sarebbe 'el.instance'. Provalo e tornerai da te a breve. –