es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Remover un elemento creado dinámicamente por su identificador en un componente de Angular.

He agregado un script externo a un componente de la siguiente manera:

ngAfterViewInit() {
let s = document.createElement(“script”);
s.id = “hs-script-loader”;
s.async = true;
s.src = “//some-url.com/12345.js”;
this.element.nativeElement.appendChild(s);
}

El script carga un widget de chat en vivo que se crea dinámicamente en el DOM cuando se carga el script.

Me gustaría eliminar el elemento del DOM cuando se destruye el componente, pero no estoy seguro de cómo crear una referencia a un elemento creado dinámicamente.

He visto ejemplos que utilizan elementRef, pero esto asume que tienes control sobre el elemento y que no se crea dinámicamente.

¿Cómo puedo apuntar a un elemento de forma dinámica, similar al uso de la delegación de eventos pero en Angular?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una forma de lograr esto es utilizando el decorador ViewChild para crear una referencia al elemento creado dinámicamente.

    Primero, agrega una variable de referencia de plantilla al método ngAfterViewInit:

    ngAfterViewInit() {
      let s = document.createElement("script");
      s.id = "hs-script-loader";
      s.async = true;
      s.src = "//some-url.com/12345.js";
      this.element.nativeElement.appendChild(s);
      // Agrega la siguiente línea para crear una variable de referencia de plantilla
      const chatWidget = document.getElementById('chat-widget');
    }
    

    Luego, agrega un decorador ViewChild a la clase del componente para crear una referencia al elemento:

    import { Component, ViewChild, ElementRef, OnDestroy } from '@angular/core';
    
    @Component({
      selector: 'app-my-component',
      template: '<div id="chat-widget"></div>'
    })
    export class MyComponent implements OnDestroy {
      @ViewChild('chatWidget', { static: false }) chatWidgetRef: ElementRef;
      chatWidget: HTMLElement;
    
      constructor(private element: ElementRef) {}
    
      ngAfterViewInit() {
        let s = document.createElement("script");
        s.id = "hs-script-loader";
        s.async = true;
        s.src = "//some-url.com/12345.js";
        this.element.nativeElement.appendChild(s);
        // Agrega la siguiente línea para crear una referencia al elemento creado dinámicamente
        this.chatWidget = this.chatWidgetRef.nativeElement;
      }
    
      ngOnDestroy() {
        // Elimina el elemento creado dinámicamente cuando el componente es destruido
        this.chatWidget.remove();
      }
    }
    

    Y finalmente, agrega la variable de referencia de plantilla al template:

    <app-my-component>
      <div #chatwidget="" id="chat-widget"></div>
    </app-my-component>
    

    Esto crea una referencia al elemento creado dinámicamente utilizando ViewChild y lo elimina del DOM cuando el componente es destruido utilizando ngOnDestroy.

Comments are closed.