Je veux compiler manuellement certaines directives contenant du HTML. Quel est l'équivalent de $compile
dans Angular 2?
Par exemple, dans Angular 1, je pourrais compiler dynamiquement un fragment de HTML et l'ajouter au DOM:
var e = angular.element('<div directive></div>');
element.append(e);
$compile(e)($scope);
Réponses:
Angulaire 2.3.0 (07/12/2016)
Pour obtenir tous les détails, vérifiez:
Pour voir cela en action:
Les principaux:
1) Créer un modèle
2) Créer un composant
3) Créer un module
4) Compiler un module
5) Créer (et mettre en cache) ComponentFactory
6) utiliser Target pour en créer une instance
Un aperçu rapide de la création d'un composant
Un moyen d'injecter un composant dans NgModule
Un extrait de code comment créer un
ComponentFactory
(et le mettre en cache)Un extrait de code comment utiliser le résultat ci-dessus
La description complète avec tous les détails lisez ici , ou observez l' exemple de travail
.
.
la source
ComponentFactory
etViewContainerRef
pour remplacer le DynamicComponentLoader maintenant obsolète.$compile($element.contents())($scope.$new());
et maintenant c'est des centaines de lignes de code, avec la création de NgModule ... C'est le genre de chose qui me donne envie d'éviter NG2 et de passer à quelque chose de mieux.JitCompiler
si votre exemple peut fonctionner avecCompiler
de@angular/core
? plnkr.co/edit/UxgkiT?p=previewRemarque: comme @BennyBottema le mentionne dans un commentaire, DynamicComponentLoader est désormais obsolète, d'où cette réponse.
Angular2 n'a pas d' équivalent $ compile . Vous pouvez utiliser
DynamicComoponentLoader
et pirater avec les classes ES6 pour compiler votre code dynamiquement (voir ce plunk ):Mais cela ne fonctionnera que jusqu'à ce que l'analyseur HTML soit à l'intérieur du noyau angular2.
la source
DynamicComponentLoader
étant obsolète, comment faire le même genre de chose dans Angular 2? Disons que j'ai une boîte de dialogue modale et que je veux charger dynamiquement un nouveau composant tel que son contenuVersion angulaire que j'ai utilisée - Angular 4.2.0
Angular 4 est venu avec ComponentFactoryResolver pour charger les composants au moment de l'exécution. C'est une sorte de même implémentation de $ compile dans Angular 1.0 qui répond à vos besoins
Dans cet exemple ci-dessous, je charge le composant ImageWidget dynamiquement dans un DashboardTileComponent
Afin de charger un composant, vous avez besoin d'une directive que vous pouvez appliquer à ng-template qui aidera à placer le composant dynamique
WidgetHostDirective
cette directive injecte ViewContainerRef pour accéder au conteneur de vue de l'élément qui hébergera le composant ajouté dynamiquement.
DashboardTileComponent (composant d'espace réservé pour le rendu du composant dynamique)
Ce composant accepte une entrée provenant d'un composant parent ou vous pouvez charger à partir de votre service en fonction de votre implémentation. Ce composant joue le rôle principal pour résoudre les composants lors de l'exécution. Dans cette méthode, vous pouvez également voir une méthode nommée renderComponent () qui charge finalement le nom du composant à partir d'un service et le résout avec ComponentFactoryResolver et enfin la définition des données sur le composant dynamique.
DashboardTileComponent.html
WidgetComponentService
Il s'agit d'une fabrique de services pour enregistrer tous les composants que vous souhaitez résoudre dynamiquement
ImageTextWidgetComponent (composant que nous chargeons au moment de l'exécution)
Ajouter Enfin, ajoutez ce ImageTextWidgetComponent à votre module d'application en tant qu'entréeComponent
TileModel
Référence originale de mon blog
Documentation officielle
Télécharger un exemple de code source
la source
entryComponents
. Sans cela, votre solution ne fonctionnera pasce package npm m'a facilité la tâche: https://www.npmjs.com/package/ngx-dynamic-template
usage:
la source
Afin de créer de manière dynamique une instance d'un composant et de l'attacher à votre DOM, vous pouvez utiliser le script suivant et devrait fonctionner dans Angular RC :
modèle html:
Composant de chargeur
la source
Angular TypeScript / ES6 (Angular 2+)
Fonctionne avec AOT + JIT à la fois ensemble.
J'ai créé comment l'utiliser ici: https://github.com/patrikx3/angular-compile
Composant: devrait avoir un contexte et des données html ...
Html:
la source
$compile(...)($scope)
. Il n'y a rien dessus, même dans le fichier readme du repo.Vous pouvez voir le composant, qui permet de compiler des composants angulaires dynamiques simples https://www.npmjs.com/package/@codehint-ng/html-compiler
la source
Je sais que ce problème est ancien, mais j'ai passé des semaines à essayer de comprendre comment faire fonctionner ce problème avec AOT activé. J'ai pu compiler un objet mais je n'ai jamais pu exécuter des composants existants. Eh bien, j'ai finalement décidé de changer de tact, car je ne cherchais pas tant à compiler du code qu'à exécuter un modèle personnalisé. Ma pensée était d'ajouter le html que tout le monde peut faire et boucler dans les usines existantes. Ce faisant, je peux rechercher l'élément / l'attribut / etc. et exécutez le composant sur ce HTMLElement. J'ai pu le faire fonctionner et j'ai pensé que je devrais partager cela pour sauver à quelqu'un d'autre l'immense temps que j'ai perdu.
la source
Si vous souhaitez injecter du code html, utilisez la directive
Si vous souhaitez charger un composant entier à un endroit, utilisez DynamicComponentLoader:
https://angular.io/docs/ts/latest/api/core/DynamicComponentLoader-class.html
la source