Angular2 - catch/subscribe to (click) event in dynamically added HTML

前端 未结 2 381
眼角桃花
眼角桃花 2020-12-03 12:07

I\'m attempting to inject a string that contains a (click) event into the Angular2 template. The string is dynamically retrieved from the back-end much after t

相关标签:
2条回答
  • 2020-12-03 13:00

    Declarative event binding is only supported in static HTML in a components template.
    If you want to subscribe to events of elements dynamically added, you need to do it imperatively.

    elementRef.nativeElement.querySelector(...).addEventListener(...)
    

    or similar.

    If you want to be WebWorker-safe, you can inject the Renderer

    constructor(private elementRef:ElementRef, private renderer:Renderer) {}
    

    and use instead

    this.renderer.listen(this.elementRef.nativeElement, 'click', (event) => { handleClick(event);});
    

    to register an event handler.

    see also Dynamically add event listener in Angular 2

    0 讨论(0)
  • 2020-12-03 13:02

    I had problems importing ElementRef in my service and did not want to pass Renderer reference there. This Service is about showing 'Loading...' dialog where after 3 seconds dynamic close button is attached. I found solution how to add click event for this button using jQuery. Hopefully this helps someone.

    (1) Add jQuery to Angular 2 index.html file

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    

    (2) Declare $

    declare var $: any;
    

    (3) Use jQuery This is piece of code from my service:

     public async present() {
        this.isLoading = true;
        return await this.loadingController.create({message: 'Loading...'}).then(a => {
          a.present().then(() => {
            setTimeout(() => {
              a.message += '<ion-icon name="close-circle" class="alert-cancel-button"></ion-icon>';
    
    
              // Here starts jQuery usage
              $(a).click((clickedObject) => {
                if ($(clickedObject.target).hasClass('alert-cancel-button')) {
                  this.dismiss();
                }
              });
    
    
            }, 3000);
          });
        });
      }
    
      public async dismiss() {
        return await this.loadingController.dismiss();
      }
    
    • By the way $('alert-cancel-button').click(() => this.dismiss()) didn't work.
    0 讨论(0)
提交回复
热议问题