指令文件:我正在尝试这样做,如果我的计数器超过两个,它应该停止事件或 keyUp 来反射(reflect),但它不起作用。有人可以帮我解决这个问题吗?
import { Component, HostListener, HostBinding } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
export enum KeyCodes {
LEFT = 37,
RIGHT = 39,
}
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
counter: number = 0;
fragment: string;
classBorder: string = '';
constructor(private _route: ActivatedRoute) {
// this.fragment = _route.snapshot.fragment;
}
@HostListener('document:keyup', ['$event'])
KeyUpEvent(event: KeyboardEvent) {
if (event.keyCode == KeyCodes.LEFT) this.counter--;
if (event.keyCode == KeyCodes.RIGHT) this.counter++;
if (this.counter > 2) {
event.preventDefault();
event.stopPropagation();
}
}
}
最佳答案
您可能希望在 OnInit 中为事件创建一个可观察对象,然后通过管道将其仅获取发出的前 2 个值:
export class AppComponent implements OnInit {
ngOnInit() {
fromEvent(document, 'keydown').pipe(
filter((e: KeyboardEvent) => e.keyCode === KeyCodes.LEFT),
take(2),
).subscribe(
(x: KeyboardEvent) => console.log(x)
)
}
}
preventDefault()
仅禁用浏览器的默认行为,它通常用于防止某些事件和类似事件的刷新。
您还可以使用 takeUntil()
等待另一个可观察对象触发,以实现像您这样稍微复杂的逻辑。
counter = 0
countSubject = new Subject
get count$() {
return this.countSubject.asObservable()
}
ngOnInit() {
fromEvent(document, 'keydown').pipe(
tap((e: KeyboardEvent) => {
if (e.keyCode === KeyCodes.LEFT) {
this.countSubject.next(++this.counter)
}
if (e.keyCode === KeyCodes.RIGHT) {
this.countSubject.next(--this.counter)
}
}),
takeUntil(this.count$.pipe(
filter((v:number) => v === 2)
)),
).subscribe(
(x: KeyboardEvent) => console.log(x)
)
}
我在 Stackblitz 上做了一个工作示例为你。
关于javascript - event.preventDefault() 或 event.stopPropagation() 不适用于 keyUp 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72222702/