Создать прослушиватель событий для динамически созданного элемента HTML

Внутри обработчика событий "downMouseBtn(event)", я создал элемент <div id = "rectangle"></ div>

Мне нужно создать eventListener для созданного элемента.

Как я могу создать это? Какую часть кода добавить?

Мне нужно обработать событие mouseClick для динамически генерируемого элемента.

import { Component, OnInit, ViewChild, ElementRef, Renderer2 } from '@angular/core';

@Component({ selector: 'app-editor', templateUrl:'./editor.component.html', styleUrls: ['./editor.component.css']})

export class EditorComponent implements OnInit {
  constructor(private renderer: Renderer2, private elRef: ElementRef) { }

  ngOnInit() { }

  downMouseBtn(event) {
    this.rectangle = document.createElement('div'); /*dynamically create element*/
    this.rectangle.setAttribute("id", "rectangle"); /*set id for element*/

    this.renderer.appendChild(this.editorPhotoWrapper.nativeElement, this.rectangle); /*add element via renderer*/

    /* problemAreaStart */
    this.renderer.listen(this.rectangle.nativeElement, 'click', (event) => {
      console.info("test");
    });    
    /* problemAreaStop */
  }
}

Можете ли вы объяснить, почему вам нужно создать компонент таким образом? Сведения о компонентах поступают из вашего API?

J Rui Pinto 11.07.2019 22:34

Детали компонента не поступают из API, но когда запускается «downMouseBtn (событие)», новый компонент должен быть создан на странице html. Я выбрал этот путь реализации, так как думал, что функция ".addEventListener()" работает в Angular, но при использовании получаю ошибку "element is undefined". Какие еще есть способы решить эту проблему?

Elkhan Isayev 11.07.2019 22:49

Я исследую, чтобы понять, почему это не работает. В то же время обходной путь может быть возможен, если вы создадите угловой компонент (rectangleComponent) и покажете/скроете его с помощью структурной директивы *ngIf.

J Rui Pinto 11.07.2019 22:58

Не могу применить директивы, т.к. неизвестно сколько раз срабатывало "downMouseBtn (event)" (и сколько новых <div id = "rectangle"> </ div> будет добавлено на html страницу).

Elkhan Isayev 11.07.2019 23:10

при каждом downMouseBtn(событии) вы можете поместить элемент в фиктивный массив и использовать *ngFor для создания компонента прямоугольника для каждого фиктивного элемента <div *ngFor = "dummyElement in dummyArray"><rectangle (click) = "doSomething()" ></прямоугольник></дел>

J Rui Pinto 11.07.2019 23:24
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
2
5
1 348
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуй это

import { Component, OnInit, ViewChild, ElementRef, Renderer2 } from '@angular/core';

@Component({ selector: 'app-editor', templateUrl:'./editor.component.html', styleUrls: ['./editor.component.css']})

export class EditorComponent implements OnInit {
  constructor(private renderer: Renderer2, private elRef: ElementRef) { }

  ngOnInit() { }

  downMouseBtn(event) {
    this.rectangle = this.renderer.createElement('div'); /*dynamically create element*/
    // this.rectangle.setAttribute("id", "rectangle"); /*forget this by now*/

    this.renderer.appendChild(this.editorPhotoWrapper.nativeElement, this.rectangle); /*add element via renderer*/

    /* problemAreaStart */
    this.renderer.listen(this.rectangle, 'click', (event) => {
      console.info("test");
    });    
    /* problemAreaStop */
  }
}

давайте попробуем не касаться DOM напрямую, вместо этого используйте render2, когда это возможно.

вот ссылка на статью с alligator.io, которая легла в основу моего ответа:
https://alligator.io/angular/using-renderer2/

Что если есть отдельный URL-адрес шаблона: './editor.component.html'?

Elkhan Isayev 11.07.2019 22:25

нет проблем. я просто сделал это таким образом, чтобы сделать ответ проще для чтения и понимания :)

J Rui Pinto 11.07.2019 22:28

Я исправил условие, не могли бы вы пересмотреть его?

Elkhan Isayev 11.07.2019 22:31

Теперь я лучше понимаю ваш вопрос. Я постараюсь найти более адекватный ответ и заменить им этот ответ

J Rui Pinto 11.07.2019 22:40

Здорово! Большое спасибо!

Elkhan Isayev 12.07.2019 00:09

пожалуйста. не забудьте одобрить ответ, если он был полезен, и оценить его :)

J Rui Pinto 12.07.2019 00:11

Другие вопросы по теме