2017-11-30 5 views
0

Ich habe eine eckige 1.x-App, die mit einem dynamischen Layout arbeitet. Die App erhält ein Layout JSON mit den Metadaten des Bildschirms und generiert einfach kompilierte Komponenten im laufenden Betrieb und erstellt einen Bildschirm.Kompilieren und Rendern vorhandener Komponenten dynamisch mit Angular 5

Der entsprechende „wichtigen Code“ sieht wie folgt aus:

const element = this.$compile(`<${this.control.type} control="control" data="data"></${this.control.type}>`)(scope); 
this.$element.replaceWith(element); 

Nun, ich versuche, diese 5 bis Eckige zu wandern und ich habe verstanden, dass Angular 5 die DOM-Manipulation fallen gelassen und die kompilieren $ Funktionalität .

Ich habe rundherum gesucht und gefunden Lösungen, die wissen, wie man dynamisches HTML (zB {{1 + 1}}) und andere veraltete Sachen (vor Angular 5), aber nicht zum Rendern passen dynamisch gemachte Komponenten (und handhabt ihre inneren Bindungen).

Gibt es eine Möglichkeit, diese Art von Funktionalität erreichen kann

+0

was Sie versuchen, in Angular ist immer noch möglich, zu erreichen, diesen Artikel lesen [Hier ist, was Sie über dynamische Komponenten in Angular wissen müssen ] (https://blog.angularindepth.com/here-is-what-you-need-to-know-about-dynamic-components-in-angular-ac1e96167f9e) und [diese Antwort] (https: // stackoverflow. com/a/47472523/2545680), um eine Vorstellung davon zu bekommen, was Sie durch –

+0

gehen müssen, würde ich nicht empfehlen, diesen Weg zu gehen. Ich hatte die gleiche Strategie in AngluarJS, aber sobald wir nach Angular migriert hatten, begannen wir, alle Referenzen auf die Komponenten in einem Service zu halten, und wenn nötig, fügen wir sie nun manuell ein. Der Artikel, den ich verlinkt habe, zeigt, wie man die Komponenten manuell manipuliert. –

+0

@ AngularInDepth.com - Ich war auf der Suche nach etwas ein bisschen anders (kompilieren einer vorhandenen Komponente mit Bindungen im laufenden Betrieb). Mein Hauptproblem bestand darin, den String-Namen der Komponente in einen Typ zu konvertieren. Dieser Link hat einen sehr ähnlichen Anwendungsfall: http://blog.angular.cool/2016/11/dynamic-components-with.html Derzeit ist das der Weg, den ich nahm. Ich habe ein zusätzliches Mapping-Objekt vom Zeichenkettentyp erstellt und die dynamischen Komponenten mit ihren injizierbaren Bindungen erstellt. –

Antwort

1

Dies ist der Weg, um eine Komponente von Ihrem Selbst wie AngularJS zu erstellen: (Vergessen Sie nicht, es zu zerstören, rufen Sie zerstören() auf der componentRef zu! tun dies)

Geordnete Komponente:

@ViewChild('componentHolder', { read: ViewContainerRef }) componentHolder: ViewContainerRef; 

constructor(private componentFactoryResolver: ComponentFactoryResolver) { } 
public createComponent(): void { 
      const componentFactory = this.componentFactoryResolver.resolveComponentFactory(MyComponent); 
      const componentRef = this.componentHolder.createComponent(componentFactory); 
} 

geordnete Komponente HTML:

<button (click)="createComponent()">Add New MyComponent below</button> 
<div #componentHolder ></div> 

Fügen Sie die MyComponent im NgModule:

... 
    imports: [ 
    BrowserModule, 
    FormsModule, 
    RouterModule.forRoot(appRoutes), 
    ], 
    entryComponents: [ 
    MyComponent 
    ],... 
+0

'this.componentFactoryResolver.resolveComponentFactory (MyComponent);' - Diese Zeile ist ein Problem für mich. Wie Sie in meinem Beispiel sehen können, versuche ich den Typ eines Steuerelements aus einer Zeichenfolge aufzulösen. Danke für die Antwort. –

+0

Sie müssen ein Type Object an die resolveComponentFactory übergeben, was Sie tun können, ist eine Factory/map zu erstellen, die die Zeichenkette in den Type wie 'MyComponent' => MyComponent auflöst, ansonsten keine andere Möglichkeit schau auf den eckigen router in der routerConfig musst du auch den typ angeben. –

+0

Dies ist meine Problemumgehung für jetzt (plus das Hinzufügen dieser Komponenten als EntryComponents). Ich habe immer noch ein Problem damit, @Input()'s in die dynamische Komponente zu injizieren - weißt du, wie das zu erreichen ist? –

Verwandte Themen