Tenho algumas DIVs que podem ser marcadas com uma diretiva special
. Essa diretiva tem uma certa lógica que funciona. Agora, eu gostaria de adicionar um componente dentro da DIV que esteja equipado com a diretiva.
<div special ...>Monkey</div>
<div regular ...>Donkey</div>
Seguindo a documentação sobre como usar ViewContainerRef (sugerida por esta resposta para um problema semelhante), executo o seguinte na minha diretiva.
@Directive({ selector: "[special]" })
export class SpecialDirective {
private viewRef = inject(ViewContainerRef); ...
constructor() {
const icon = this.viewRef.createComponent(IconComponent);
}
Funciona exatamente como descrito na documentação: o ícone criado (correspondente a LeafContent
) é colocado no DOM logo após o DIV que está marcado como especial (correspondente a InnerItem
). E esse é precisamente o meu problema: quero que o ícone seja parte do HTML interno do DIV que é governado pela diretiva.
Não consigo mover a diretiva para dentro por vários motivos relacionados à sua lógica. Tentei acessar viewRef.element
e inspecionar outros campos e métodos dela. Sem sucesso. Definir o índice na criação não ajudou. O mais perto que cheguei foi desanexar/inserir dos documentos, mas isso só me deixou gerenciar a ordem dos elementos depois do meu DIV, não dentro dele.
Eu vi essa resposta , mas ela não vai ajudar no meu caso porque a alteração acontece depois que o usuário clica no DIV muito depois de ele ter sido criado e colocado na visualização.
Como posso alterar o interior da viewRef
instância? O ideal é remover algumas tags dentro dela também, além de alterar o ícone.
Como você deseja inserir o componente sem nenhum elemento filho criado, podemos usar
createComponent
o método autônomo, que recebe a entrada do injetor de ambiente e podemos usarappendChild
ofRenderer2
para anexar esse elemento criado ao originalelementRef
.Código completo:
Demonstração do Stackblitz
Você pode criar um
template reference variable
#insertHere
para especificar explicitamente onde inserir o novo componente, podemos usarviewChild
e especificar aread
propriedade para obter oViewContainerRef
que tem ocreateComponent
método.Código completo:
Demonstração do Stackblitz