typescript 当我使用2个sepate指令时,只有一个示例可以工作

m4pnthwp  于 2023-05-19  发布在  TypeScript
关注(0)|答案(2)|浏览(156)

我有一个arrow uparrow 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();
    }
  }
}

Live Demo

vltsax25

vltsax251#

事实上,这两种情况都有效。一个接一个。给你

@HostListener('document:keyup', ['$event']) onKeyup = ($event) => {

你听到的是整个文档的keyup事件。AutoFocusDirective的每个示例都会捕获它,所有的处理程序都会被执行,大概是按照指令初始化的顺序(可能)。第一个将焦点分配到某个地方(你甚至可以看到一个闪光)。然后第二个做同样的事情,偷走焦点。
一个解决方案是监听keyup,而不是监听document:keyup

tcbh2hod

tcbh2hod2#

这是因为页面中只有一个元素可以被聚焦。您必须将两个section部分放在另一个元素中,并将appFocuser指令赋予该元素。
Live Demo

相关问题