2016-08-23 1 views
0

Ich entwickle eine App auf Angular 2 und in dieser App muss ich einige Attribute in @Component Decorator dynamisch ändern. Hier ist mein Code:Anmerkungen ändern, bevor Komponente an Angular gesendet wird 2

function componentFactory (directives: any[], template: string) { 
    let annotations = Reflect.getMetadata('annotations', ComponentBase) 
    annotations[0].directives = directives 
    annotations[0].template = template 

    let metadata = new ComponentMetadata(annotations) 
    Reflect.defineMetadata('annotations', [ metadata ], ComponentBase) 

    return ComponentBase 
} 

Das Problem ist, dass, wenn ich es verwenden (mit einem ComponentResolver) ich diese Fehlermeldung erhalten: „Component‚ComponentBase‘muss entweder‚template‘oder‚templateUrl‘gesetzt.“.

Haben Sie Vorschläge?

Danke :)

+0

Warum brauchen Sie, um dynamisch ändern einige Attribute. –

+0

Danke für Ihre Antwort @pablo. Ich muss Anweisungen in meiner Komponente hinzufügen, ohne zu wissen, welche ich verwenden möchte. Ich habe es geschafft, es funktioniert, aber das ist nicht eine gute Praxis (die gleiche Klasse mehrmals deklariert): Funktion ComponentFactory (Direktiven: any [], Vorlage: String) { @ Component ({ Direktiven: Direktiven, Vorlage: Vorlage, }) Klasse ComponentBase {} return ComponentBase } –

+0

Vielleicht könnten Sie den Component-Router verwenden? –

Antwort

0

Ich habe, wie endlich gefunden dynamische Komponenten

function createDynamicComponent<T extends IBase> (componentAttributes: any, SuperClass: IConstructor<T>) { 
    class DynamicComponent extends (<IConstructor<IBase>> SuperClass) {} 

    return Component(componentAttributes)(DynamicComponent) 
} 

interface IConstructor<T> { 
    new (...args): T 
} 

interface IBase {} 

Ich habe vergessen zu schaffen, dass wir Dekorateure als Funktionen nutzen können;)

Verwandte Themen