Ich möchte einige HTML-haltige Anweisungen manuell kompilieren. Was entspricht $compile
Angular 2?
In Angular 1 könnte ich beispielsweise ein HTML-Fragment dynamisch kompilieren und an das DOM anhängen:
var e = angular.element('<div directive></div>');
element.append(e);
$compile(e)($scope);
Antworten:
Angular 2.3.0 (07.12.2016)
Um alle Details zu erhalten, überprüfen Sie:
Um das in Aktion zu sehen:
Die Auftraggeber:
1) Vorlage erstellen
2) Komponente erstellen
3) Modul erstellen
4) Modul kompilieren
5) ComponentFactory erstellen (und zwischenspeichern)
6) Mit Target eine Instanz davon erstellen
Ein kurzer Überblick über das Erstellen einer Komponente
Eine Möglichkeit, Komponenten in NgModule zu injizieren
Ein Code-Snippet zum Erstellen eines
ComponentFactory
(und Zwischenspeicherns)Ein Code-Snippet zur Verwendung des obigen Ergebnisses
Die vollständige Beschreibung mit allen Details finden Sie hier oder beobachten Sie ein Arbeitsbeispiel
.
.
quelle
ComponentFactory
undViewContainerRef
den jetzt veralteten DynamicComponentLoader ersetzt.$compile($element.contents())($scope.$new());
und jetzt sind es Hunderte von Codezeilen, einschließlich der Erstellung von NgModule ... Dies ist die Art von Dingen, die mich dazu bringen, mich von NG2 fernzuhalten und zu etwas Besserem überzugehen.JitCompiler
wenn Ihr Beispiel mitCompiler
from funktioniert@angular/core
? plnkr.co/edit/UxgkiT?p=previewHinweis: Wie @BennyBottema in einem Kommentar erwähnt, ist DynamicComponentLoader jetzt veraltet, daher auch diese Antwort.
Angular2 hat kein $ compile- Äquivalent. Sie können
DynamicComoponentLoader
ES6-Klassen verwenden und mit ihnen hacken, um Ihren Code dynamisch zu kompilieren (siehe diesen Plunk ):Es funktioniert jedoch nur, bis sich der HTML-Parser im Winkel2-Kern befindet.
quelle
DynamicComponentLoader
ist veraltet, wie machen wir das gleiche in Angular 2? Angenommen, ich habe einen modalen Dialog und möchte eine neue Komponente dynamisch als Inhalt ladenAngular Version, die ich verwendet habe - Angular 4.2.0
Angular 4 wurde mit ComponentFactoryResolver entwickelt , um Komponenten zur Laufzeit zu laden. Dies ist eine Art der gleichen Implementierung von $ compile in Angular 1.0, die Ihren Anforderungen entspricht
In diesem Beispiel lade ich die ImageWidget- Komponente dynamisch in eine DashboardTileComponent
Um eine Komponente zu laden, benötigen Sie eine Direktive, die Sie auf ng-template anwenden können, um die dynamische Komponente zu platzieren
WidgetHostDirective
Diese Anweisung fügt ViewContainerRef ein , um Zugriff auf den Ansichtscontainer des Elements zu erhalten, in dem die dynamisch hinzugefügte Komponente gehostet wird.
DashboardTileComponent (Platzhalterkomponente zum Rendern der dynamischen Komponente platzieren)
Diese Komponente akzeptiert eine Eingabe, die von einer übergeordneten Komponente stammt, oder Sie können sie basierend auf Ihrer Implementierung von Ihrem Service laden. Diese Komponente übernimmt die Hauptrolle beim Auflösen der Komponenten zur Laufzeit. In dieser Methode sehen Sie auch eine Methode namens renderComponent (), die letztendlich den Komponentennamen von einem Dienst lädt und mit ComponentFactoryResolver auflöst und schließlich Daten für die dynamische Komponente festlegt .
DashboardTileComponent.html
WidgetComponentService
Dies ist eine Service Factory, um alle Komponenten zu registrieren, die Sie dynamisch auflösen möchten
ImageTextWidgetComponent (Komponente, die wir zur Laufzeit laden)
Hinzufügen Fügen Sie diese ImageTextWidgetComponent schließlich als entryComponent zu Ihrem App-Modul hinzu
TileModel
Originalreferenz aus meinem Blog
Offizielle Dokumentation
Laden Sie den Beispielquellcode herunter
quelle
entryComponents
. Ohne es wird Ihre Lösung nicht funktionierenDieses npm-Paket hat es mir leichter gemacht: https://www.npmjs.com/package/ngx-dynamic-template
Verwendung:
quelle
Um eine Instanz einer Komponente zu erstellen und an Ihr DOM anzuhängen, können Sie das folgende Skript verwenden und sollten in Angular RC funktionieren :
HTML-Vorlage:
Ladekomponente
quelle
Angular TypeScript / ES6 (Angular 2+)
Arbeitet sofort mit AOT + JIT zusammen.
Ich habe hier die Verwendung erstellt: https://github.com/patrikx3/angular-compile
Komponente: Sollte einen Kontext und einige HTML-Daten haben ...
Html:
quelle
$compile(...)($scope)
. Es gibt nichts drauf, auch nicht in Repo Readme.Sie können die Komponente sehen, mit der einfache dynamische Angular-Komponenten kompiliert werden können: https://www.npmjs.com/package/@codehint-ng/html-compiler
quelle
Ich weiß, dass dieses Problem alt ist, aber ich habe Wochen damit verbracht, herauszufinden, wie dies mit aktiviertem AOT funktioniert. Ich konnte ein Objekt kompilieren, aber niemals vorhandene Komponenten ausführen. Nun, ich habe mich schließlich entschlossen, den Takt zu ändern, da ich nicht nur Code kompilieren, sondern eine benutzerdefinierte Vorlage ausführen wollte. Mein Gedanke war, das HTML hinzuzufügen, das jeder tun kann, und die vorhandenen Fabriken zu durchlaufen. Dabei kann ich nach dem Element / Attribut / etc. Suchen. benennt und führt die Komponente auf diesem HTMLElement aus. Ich konnte es zum Laufen bringen und dachte mir, ich sollte dies teilen, um jemand anderem die immense Zeit zu ersparen, die ich damit verschwendete.
quelle
Wenn Sie HTML-Code einfügen möchten, verwenden Sie die Direktive
Wenn Sie die gesamte Komponente an einem bestimmten Ort laden möchten, verwenden Sie DynamicComponentLoader:
https://angular.io/docs/ts/latest/api/core/DynamicComponentLoader-class.html
quelle