Eu quero compilar manualmente alguns diretórios que contêm HTML. Qual é o equivalente $compile
em Angular 2?
Por exemplo, no Angular 1, eu poderia compilar dinamicamente um fragmento de HTML e anexá-lo ao DOM:
var e = angular.element('<div directive></div>');
element.append(e);
$compile(e)($scope);
Respostas:
Angular 2.3.0 (07-12-2016)
Para obter todos os detalhes, verifique:
Para ver isso em ação:
Os diretores:
1) Criar modelo
2) Criar componente
3) Criar módulo
4) Compilar módulo
5) Criar (e armazenar em cache) ComponentFactory
6) use o Target para criar uma instância dele
Uma rápida visão geral de como criar um componente
Uma maneira de injetar componentes no NgModule
Um trecho de código como criar um
ComponentFactory
(e armazená-lo em cache)Um trecho de código como usar o resultado acima
A descrição completa com todos os detalhes pode ser lida aqui ou observe o exemplo de trabalho
.
.
fonte
ComponentFactory
eViewContainerRef
para substituir o DynamicComponentLoader agora obsoleto.$compile($element.contents())($scope.$new());
e agora são centenas de linhas de código, completas com a criação do NgModule ... Esse é o tipo de coisa que me faz querer ficar longe do NG2 e seguir para algo melhor.JitCompiler
se seu exemplo funcionar comCompiler
from@angular/core
? plnkr.co/edit/UxgkiT?p=previewNota: Como o @BennyBottema menciona em um comentário, o DynamicComponentLoader agora está obsoleto, portanto, essa é a resposta.
Angular2 não tem nenhum equivalente de compilação $ . Você pode usar
DynamicComoponentLoader
e cortar com aulas ES6 para compilar o código dinamicamente (ver este plunk ):Mas ele funcionará apenas até o analisador html estar dentro do núcleo angular2.
fonte
DynamicComponentLoader
está obsoleta, como fazemos o mesmo tipo de coisa no Angular 2? Digamos que eu tenha um diálogo modal e eu quero carregar dinamicamente um novo componente como o seu conteúdoVersão angular que usei - Angular 4.2.0
O Angular 4 veio com o ComponentFactoryResolver para carregar componentes no tempo de execução. Este é um tipo da mesma implementação do $ compile no Angular 1.0 que atende à sua necessidade
Neste exemplo abaixo, estou carregando o componente ImageWidget dinamicamente em um DashboardTileComponent
Para carregar um componente, você precisa de uma diretiva que possa ser aplicada ao ng-template que ajudará a colocar o componente dinâmico
WidgetHostDirective
essa diretiva injeta ViewContainerRef para obter acesso ao contêiner de exibição do elemento que hospedará o componente adicionado dinamicamente.
DashboardTileComponent (componente de suporte de local para renderizar o componente dinâmico)
Este componente aceita uma entrada proveniente dos componentes pai ou você pode carregar do seu serviço com base na sua implementação. Este componente está desempenhando o papel principal de resolver os componentes em tempo de execução. Nesse método, você também pode ver um método chamado renderComponent () que, finalmente, carrega o nome do componente de um serviço e é resolvido com ComponentFactoryResolver e, finalmente, configurando dados para o componente dinâmico.
DashboardTileComponent.html
WidgetComponentService
Esta é uma fábrica de serviços para registrar todos os componentes que você deseja resolver dinamicamente
ImageTextWidgetComponent (componente que estamos carregando em tempo de execução)
Adicionar Finalmente, adicione este ImageTextWidgetComponent ao seu módulo de aplicativo como entryComponent
TileModel
Referência original do meu blog
Documentação oficial
Baixar código-fonte de amostra
fonte
entryComponents
. Sem ele sua solução não vai funcionareste pacote npm facilitou para mim: https://www.npmjs.com/package/ngx-dynamic-template
uso:
fonte
Para criar dinamicamente uma instância de um componente e anexá-la ao seu DOM, você pode usar o seguinte script e deve funcionar no Angular RC :
modelo html:
Componente carregador
fonte
Angular TypeScript / ES6 (Angular 2+)
Trabalha com AOT + JIT de uma vez juntos.
Eu criei como usá-lo aqui: https://github.com/patrikx3/angular-compile
Componente: deve ter um contexto e alguns dados html ...
Html:
fonte
$compile(...)($scope)
. Não há nada nele, mesmo no repositório readme.Você pode ver o componente que permite compilar componentes angulares dinâmicos simples https://www.npmjs.com/package/@codehint-ng/html-compiler
fonte
Sei que esse problema é antigo, mas passei semanas tentando descobrir como fazer isso funcionar com o AOT ativado. Consegui compilar um objeto, mas nunca consegui executar componentes existentes. Bem, finalmente decidi mudar de tato, pois não estava procurando compilar código, mas executar um modelo personalizado. Meu pensamento era adicionar o html que qualquer um pode fazer e fazer um loop pelas fábricas existentes. Ao fazer isso, posso procurar o elemento / atributo / etc. nomes e execute o componente nesse HTMLElement. Consegui fazê-lo funcionar e achei que deveria compartilhar isso para economizar a outra pessoa a imensa quantidade de tempo que gastei nele.
fonte
Se você deseja injetar código html, use a diretiva
Se você deseja carregar o componente inteiro em algum lugar, use DynamicComponentLoader:
https://angular.io/docs/ts/latest/api/core/DynamicComponentLoader-class.html
fonte