Как разрешить нажатие на кнопку раз в 1 секунду?

Для разрешения нажатия на кнопку раз в 1 секунду в Angular можно использовать директиву или обработчик событий.

1. Использование директивы:
В Angular можно создать собственную директиву, которая будет отвечать за ограничение нажатий на кнопку. Для этого нужно выполнить следующие шаги:
- Создайте новую директиву с помощью команды ng generate directive buttonClickLimit.
- В файле директивы button-click-limit.directive.ts добавьте следующий код:

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

     @Directive({
       selector: '[appButtonClickLimit]'
     })
     export class ButtonClickLimitDirective {
       private lastClickTime: number;

       constructor(private el: ElementRef) { }

       @HostListener('click') onClick() {
         const currentTime = Date.now();
         if (!this.lastClickTime || currentTime - this.lastClickTime >= 1000) {
           this.lastClickTime = currentTime;
           this.el.nativeElement.disabled = true;
           setTimeout(() => {
             this.el.nativeElement.disabled = false;
           }, 1000);
         }
       }
     }

- В шаблоне HTML добавьте атрибут appButtonClickLimit к кнопке, на которую требуется наложить ограничение нажатий:

     <button appButtonClickLimit>Нажать</button>

Теперь кнопка будет неактивна на 1 секунду после каждого нажатия.

2. Использование обработчика событий:
Другим способом решения задачи является создание обработчика событий в компоненте. Для этого нужно выполнить следующие шаги:
- В компоненте создайте переменную, которая будет управлять состоянием кнопки:

     isButtonDisabled: boolean = false;

- В шаблоне HTML добавьте атрибут [disabled] к кнопке и привяжите его к переменной isButtonDisabled:

     <button [disabled]="isButtonDisabled" (click)="onClick()">Нажать</button>

- В компоненте создайте метод onClick(), который будет выполнять проверку времени последнего нажатия и включать/выключать кнопку:

     onClick() {
       const currentTime = Date.now();
       if (!this.lastClickTime || currentTime - this.lastClickTime >= 1000) {
         this.lastClickTime = currentTime;
         this.isButtonDisabled = true;
         setTimeout(() => {
           this.isButtonDisabled = false;
         }, 1000);
       }
     }

Теперь кнопка будет неактивна на 1 секунду после каждого нажатия.

Ниже представлен пример кода для директивы и обработчика событий:

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

@Directive({
  selector: '[appButtonClickLimit]'
})
export class ButtonClickLimitDirective {
  private lastClickTime: number;

  constructor(private el: ElementRef) { }

  @HostListener('click') onClick() {
    const currentTime = Date.now();
    if (!this.lastClickTime || currentTime - this.lastClickTime >= 1000) {
      this.lastClickTime = currentTime;
      this.el.nativeElement.disabled = true;
      setTimeout(() => {
        this.el.nativeElement.disabled = false;
      }, 1000);
    }
  }
}
<button appButtonClickLimit>Нажать</button>
isButtonDisabled: boolean = false;

onClick() {
  const currentTime = Date.now();
  if (!this.lastClickTime || currentTime - this.lastClickTime >= 1000) {
    this.lastClickTime = currentTime;
    this.isButtonDisabled = true;
    setTimeout(() => {
      this.isButtonDisabled = false;
    }, 1000);
  }
}
<button [disabled]="isButtonDisabled" (click)="onClick()">Нажать</button>

Оба подхода помогут реализовать ограничение на нажатие кнопки раз в 1 секунду. Выбор между использованием директивы или обработчика событий зависит от предпочтений разработчика и контекста использования кнопки.