Обработка событий onblur с помощью angular

#angular #typescript

#angular #typescript

Вопрос:

С помощью jQuery я могу просто написать что-то вроде

 $(document).on("blur", ".class_name", function(){}
  

для того, чтобы вызвать некоторую функцию при событии размытия class_name элементов. Как бы я добился тех же результатов с помощью angular?

Такие решения, как

 <input (blur)='on_blur_function()'.... >
  

к сожалению, для моего случая неприемлемы. Спасибо.

Ответ №1:

Вы можете сделать это легко:

импортируйте и вводите ElementRef в конструктор

 constructor(private elem: ElementRef){}
  

Поиск элементов с помощью API querySelectorAll.

 ngAfterViewInit(){
    let elements = this.elem.nativeElement.querySelectorAll('.class_name');
    elements.forEach(element => {
     // you can iterate through each element and call your function
     this.on_blur_function(); // call your function
 });
}
  

Ответ №2:

Вы можете создать директиву и использовать класс в качестве ее селектора :

 import { Directive, HostListener } from "@angular/core";

@Directive({
  selector: ".foo"
})
export class BlurredDirective {
  @HostListener("blur")
  blurred() {
    console.log("blurred");
  }

  constructor() {}
}

  

В вашем шаблоне :

 <input class="foo" >
  

Ответ №3:

Если вы не хотите использовать директиву, вы можете использовать изолированный подход, используя ViewChildren в сочетании со ссылочной переменной шаблона:

 import {
  AfterViewInit,
  Component,
  ElementRef,
  OnDestroy,
  QueryList,
  ViewChildren
} from "@angular/core";
import { fromEvent, Subject } from "rxjs";
import { takeUntil } from "rxjs/operators";

@Component({
  selector: "my-app",
  template: `
    <input #inputRef />
    <input #inputRef />
  `,
  styleUrls: ["./app.component.css"]
})
export class AppComponent implements AfterViewInit, OnDestroy {
  @ViewChildren("inputRef") elements: QueryList<ElementRef>;

  ngUnsubscribe$ = new Subject<void>();

  ngAfterViewInit() {
    this.elements.forEach(element => {
      fromEvent(element.nativeElement, "blur")
        .pipe(takeUntil(this.ngUnsubscribe$))
        .subscribe((event: FocusEvent) => this.customBlurEvent(event));
    });
  }

  ngOnDestroy() {
    this.ngUnsubscribe$.next();
  }

  customBlurEvent(event: FocusEvent) {
    console.log({ event });
  }
}
  

Добавляя #inputRef к входным данным, вы можете запросить его после инициализации представления внутри ngAfterViewInit . rxjs имеет имя наблюдаемого создателя fromEvent , который принимает источник и тип события, в данном случае входные данные и событие размытия. Затем вы можете отправить свой метод с событием, отписавшись от источника события, когда компонент будет уничтожен (отсюда и мой призыв takeUntil , чтобы избежать утечек памяти).