Это либо то, что вы хотите, либо очень близко к этому:
import { Component, ViewChild, ElementRef } from '@angular/core';
import { fromEvent } from 'rxjs';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
@ViewChild('mybutton') button: ElementRef;
ngAfterViewInit() {
fromEvent(this.button.nativeElement, 'dblclick')
.subscribe(e => console.log('double click'));
fromEvent(this.button.nativeElement, 'click')
.subscribe((e: MouseEvent) => {
if (e.detail === 1) console.log('one click') // could use a filter inside a pipe instead of using an if statement
// if (e.detail === 2) console.log('double click') // an alternative for handling double clicks
});
}
}
и HTML:
<button #mybutton>Test</button>
Это решение использует event.detail и свободно основано на этом полезном сообщении - Предотвращение срабатывания события click при возникновении события dblclick , которое не только обсуждает event.detail, но и учитывает связанные с этим проблемы синхронизации.
Одна из важных проблем в вашем коде заключается в том, что вы подписываетесь на событие внутри функции, которая вызывается несколько раз, что означает, что при каждом нажатии кнопки вы создаете новую подписку. Использование ngAfterViewInit
(которое вызывается только один раз как часть жизненного цикла) предотвращает эту проблему (и обеспечивает загрузку DOM).
Вот для вас стек-блиц:
https://stackblitz.com/edit/angular-t6cvjj
Простите за мои неряшливые объявления типов!
Это удовлетворяет вашим требованиям следующим образом:
- Если я нажму один раз, мне нужно увидеть только одно сообщение («один клик») - PASS
- Если я щелкаю дважды (двойной щелчок), все равно мне нужно видеть только одно сообщение («двойной щелчок») - FAIL, вы видите «один щелчок» при первом щелчке и «двойной щелчок» при втором щелчке
- Если я нажму более двух раз - ничего не произойдет - ПРОЙДИТЕ
Из-за проблем со сроками, которые обсуждались в данной статье, вопрос о том, как вы решаете эту проблему, является вопросом предпочтения, и поэтому я решил не решать его. Кроме того, вы не платите мне;) Однако этот ответ должен помочь вам полностью решить его.
PS Есть комментарий к SO сообщению выше, который предполагает, что event.detail может не работать на IE11