我有一个arrow up
和arrow down
需要的指令。当我复制和分页指令的示例之一时,只有第二个工作,但不是第一个。
如何解决这个问题?请关注第一个元素上的第二部分“绿色”部分,并执行up and down
箭头移动。
directive.ts:
import {
Directive,
ElementRef,
HostListener,
AfterViewInit,
} from '@angular/core';
@Directive({
selector: '[appFocuser]',
})
export class AutoFocusDirective implements AfterViewInit {
focusableArray = [];
parent = null;
count = 0;
currentFocus: HTMLElement;
constructor(private el: ElementRef) {}
@HostListener('document:keyup', ['$event']) onKeyup = ($event) => {
if ($event.code === 'ArrowDown') {
if (this.count >= this.focusableArray.length - 1) {
this.count = 0;
this.focusableArray[this.count].focus();
return;
}
this.count++;
this.focusableArray[this.count].focus();
}
if ($event.code === 'ArrowUp') {
if (this.count == 0) {
this.count = this.focusableArray.length - 1;
this.focusableArray[this.count].focus();
return;
}
this.count--;
this.focusableArray[this.count].focus();
}
};
ngAfterViewInit() {
this.parent = this.el.nativeElement;
this.focusableArray = Array.from(
this.parent.querySelectorAll(`[data-focus=true]`)
);
if (this.focusableArray.length) {
this.currentFocus = this.focusableArray[this.count];
this.currentFocus.focus();
}
}
}
2条答案
按热度按时间vltsax251#
事实上,这两种情况都有效。一个接一个。给你
你听到的是整个文档的keyup事件。
AutoFocusDirective
的每个示例都会捕获它,所有的处理程序都会被执行,大概是按照指令初始化的顺序(可能)。第一个将焦点分配到某个地方(你甚至可以看到一个闪光)。然后第二个做同样的事情,偷走焦点。一个解决方案是监听
keyup
,而不是监听document:keyup
。tcbh2hod2#
这是因为页面中只有一个元素可以被聚焦。您必须将两个
section
部分放在另一个元素中,并将appFocuser
指令赋予该元素。Live Demo