2016-07-28 29 views
0

Ich habe einige Komponenten, die ich meiner Seite dynamisch hinzufügen möchte.Komponente aus einer Zeichenfolge erstellen

Ich habe ihren Namen in einer Konfigurationsdatei config.json, derzeit der Typoskript Klassenname MySuperComponent. Ich kann alles, was ich will in meine Konfigurationsdatei setzen, ist der Klassenname nicht geeignet.

Ich habe Code mit Komponenten-Resolver versucht, aber ich kann keine Zeichenfolge an sie übergeben.

Dies funktioniert:

this.resolver.resolveComponent(MySuperComponent) 

Dies gilt nicht:

this.resolver.resolveComponent("MySuperComponent") 

Wie kann ich instanziieren (und injizieren) einer Komponente aus einem String?

+0

Ich denke, das [github issue] (https://github.com/systemjs/systemjs/issues/1295) Link sollte Ihnen helfen. Danke :) –

+0

@PankajParkar Der 'DynamicComponentLoader' ist veraltet, ich möchte ihn nicht benutzen. – blue112

+1

Ich denke, dass Pankaj wollte dir zeigen, die Verwendung von 'System.import' ;-) Dies gilt in Ihrem Fall ... –

Antwort

1

Sie können eine Karte einrichten und sie von einem Dienst, der von String übersetzt

import {MySuperComponent} from './MySuperComponent'; 

@Injectable() 
class ComponentTypes { 
    types = { 
    MySuperComponent: MySuperComponent 
    }; 
    toType(name:string) { 
    return types[name]; 
    } 
} 

zu geben, wo Sie es verwenden

@Component({ 
    ... 
    providers: [ComponentTypes], 
}) 
class SomeComponent { 
    constructor(private componentTypes:ComponentTypes) {} 

    addDynamicComponent() { 
    ... 
    this.resolver.resolveComponent(this.componentTypes.toType("MySuperComponent")) 

    } 
} 

Siehe auch Angular2, manually resolve a type by string/name

+1

Das Aufzählen jeder einzelnen Komponente, die ich installieren könnte, scheint völlig unterproduktiv zu sein. – blue112

+1

So funktionieren starke Typen. Siehe die verknüpfte Frage für andere Antworten. –

+0

Ich bin (und sollte) ein fauler Programmierer sein. Wenn ich eine neue Komponente implementiere, erwarte ich nicht, eine "Komponentenbank" -Datei zu aktualisieren, nur um sie zu lösen. – blue112

1

Nach der Pankaj des Kommentar, könnten Sie verwenden System.import:

+0

Gehen Sie nicht davon aus, dass ich systemjs verwende. Ich verwende kein Framework oder keine Ladebibliothek. Momentan benutze ich Webpack, aber ich möchte nicht an eine Ladebibliothek gebunden sein. – blue112

Verwandte Themen