Quiero compilar manualmente algunas directivas que contienen HTML. ¿Cuál es el equivalente de $compile
en Angular 2?
Por ejemplo, en Angular 1, podría compilar dinámicamente un fragmento de HTML y agregarlo al DOM:
var e = angular.element('<div directive></div>');
element.append(e);
$compile(e)($scope);
angular
typescript
angular2-compiler
version-compatibility
bits de píxel
fuente
fuente
Respuestas:
Angular 2.3.0 (2016-12-07)
Para obtener todos los detalles, consulte:
Para ver eso en acción:
Los principales:
1) Crear plantilla
2) Crear componente
3) Crear módulo
4) Compilar módulo
5) Crear (y almacenar en caché) ComponentFactory
6) usar Target para crear una instancia del mismo
Una descripción rápida de cómo crear un componente
Una forma de inyectar componentes en NgModule
Un fragmento de código sobre cómo crear un
ComponentFactory
(y almacenarlo en caché)Un fragmento de código sobre cómo usar el resultado anterior
La descripción completa con todos los detalles leídos aquí , u observe un ejemplo de trabajo
.
.
fuente
ComponentFactory
yViewContainerRef
reemplazar el ahora obsoleto DynamicComponentLoader.$compile($element.contents())($scope.$new());
y ahora son cientos de líneas de código, completas con la creación de NgModule ... Este es el tipo de cosas que me dan ganas de alejarme de NG2 y pasar a algo mejor.JitCompiler
si su ejemplo podría funcionarCompiler
desde@angular/core
? plnkr.co/edit/UxgkiT?p=previewNota: Como @BennyBottema menciona en un comentario, DynamicComponentLoader ahora está en desuso, por lo tanto, esta respuesta también.
Angular2 no tiene ningún equivalente de $ compilación . Puede usar
DynamicComoponentLoader
y piratear con las clases de ES6 para compilar su código dinámicamente (consulte este plunk ):Pero solo funcionará hasta que el analizador html esté dentro del núcleo angular2.
fuente
DynamicComponentLoader
está en desuso, ¿cómo hacemos el mismo tipo de cosas en Angular 2? Digamos que tengo un cuadro de diálogo modal y quiero cargar dinámicamente un nuevo componente como su contenidoVersión angular que he usado - Angular 4.2.0
A Angular 4 se le ocurrió ComponentFactoryResolver para cargar componentes en tiempo de ejecución. Este es un tipo de implementación de $ compile en Angular 1.0 que satisface sus necesidades.
En el siguiente ejemplo, estoy cargando el componente ImageWidget dinámicamente en un DashboardTileComponent
Para cargar un componente, necesita una directiva que pueda aplicar a ng-template que le ayudará a colocar el componente dinámico
WidgetHostDirective
Esta directiva inyecta ViewContainerRef para obtener acceso al contenedor de vista del elemento que alojará el componente agregado dinámicamente.
DashboardTileComponent (Coloque el componente de soporte para representar el componente dinámico)
Este componente acepta una entrada que proviene de componentes principales o puede cargar desde su servicio en función de su implementación. Este componente cumple la función principal de resolver los componentes en tiempo de ejecución. En este método también puede ver un método llamado renderComponent () que finalmente carga el nombre del componente de un servicio y lo resuelve con ComponentFactoryResolver y finalmente establece los datos en el componente dinámico.
DashboardTileComponent.html
WidgetComponentService
Esta es una fábrica de servicios para registrar todos los componentes que desea resolver dinámicamente.
ImageTextWidgetComponent (componente que estamos cargando en tiempo de ejecución)
Agregar Finalmente, agregue este ImageTextWidgetComponent a su módulo de aplicación como entryComponent
TileModel
Referencia original de mi blog
Documentación oficial
Descargar código fuente de muestra
fuente
entryComponents
. Sin ella, su solución no funcionaráeste paquete npm me lo hizo más fácil: https://www.npmjs.com/package/ngx-dynamic-template
uso:
fuente
Para crear dinámicamente una instancia de un componente y adjuntarlo a su DOM, puede usar el siguiente script y debería funcionar en Angular RC :
plantilla html:
Componente del cargador
fuente
Angular TypeScript / ES6 (Angular 2+)
Funciona con AOT + JIT a la vez juntos.
Creé cómo usarlo aquí: https://github.com/patrikx3/angular-compile
Componente: debe tener un contexto y algunos datos html ...
HTML:
fuente
$compile(...)($scope)
. No hay nada en él, incluso en el archivo readme.Puede ver el componente, que permite compilar componentes angulares dinámicos simples https://www.npmjs.com/package/@codehint-ng/html-compiler
fuente
Sé que este problema es antiguo, pero pasé semanas tratando de descubrir cómo hacer que esto funcione con AOT habilitado. Pude compilar un objeto pero nunca pude ejecutar componentes existentes. Bueno, finalmente decidí cambiar de tacto, ya que no estaba buscando compilar código tanto como ejecutar una plantilla personalizada. Pensé en agregar el html que cualquiera puede hacer y recorrer las fábricas existentes. Al hacerlo, puedo buscar el elemento / atributo / etc. nombres y ejecutar el componente en ese elemento HTMLE. Pude hacer que funcionara y pensé que debería compartir esto para ahorrarle a alguien la inmensa cantidad de tiempo que desperdicié.
fuente
Si desea inyectar código html, use la directiva
Si desea cargar el componente completo en algún lugar, use DynamicComponentLoader:
https://angular.io/docs/ts/latest/api/core/DynamicComponentLoader-class.html
fuente