javascript - Angular ul,cdk-virtual-scroll-viewport 列表,键盘选择

标签 javascript angular typescript angular-cdk

尝试创建一个自动完成组件功能。

当用户开始输入时,会弹出一个小窗口,其中包含可供选择的选项。 我希望用户能够使用他的键盘选择一个选项。

例子: - 用户输入“Hou” - 选项显示 ["House", "Houston"] - 用户点击向下键盘键并点击enter选择“房子”

我的弹出滚动组件:

<ul class="plDropdown-optionList">
          <cdk-virtual-scroll-viewport style="height: 200px" itemSize="30">
            <ng-container *cdkVirtualFor="let option of displayableOptions">
              <button class="plDropdown-option" type="button" (click)="selectOption(option)">
                {{option}}
              </button>
            </ng-container>
          </cdk-virtual-scroll-viewport>
        </ul>

最佳答案

为任何寻找此问题的人发布解决方案选项。

我使用了来自 Input 标签的键盘事件:

<input (keydown)="processInput($event)">

然后找到按下的是什么:

processInput(evt: KeyboardEvent): void

保留选定的引用并更新它:

private _updateIndex(key: string): void {
    switch (key) {
      case Key.ArrowUp:
        if (this.selectedIndex === 0) {
          return;
        }

        this._setIndex(this.selectedIndex -= 1);
        break;

      case Key.ArrowDown:
        this.displayedTags$
        .pipe(
          take(1)
        )
          .subscribe((results) => {
            if (this.selectedIndex >= results.length - 1) {
              this._setIndex(results.length - 1);

              return;
            }

            this._setIndex(this.selectedIndex += 1);
          });
        break;

      default:
        break;
    }
  }

  private _selectIndex(): void {
    this.displayedTags$.pipe(
      take(1)
    )
    .subscribe((results) => {
      const result = results[this.selectedIndex];

      if (result) {
        this.selectResult(result);
      }
    });
  }

  private _setIndex(index: number): void {
    this.selectedIndex = index;
  }

在 HTML 文件中,使用这一行来突出显示当前行:

[ngClass]="{'focus-background': selectedIndex == idx}"

看起来像这样:

 <cdk-virtual-scroll-viewport style="height: 400px" itemSize="30">
            <ng-container *cdkVirtualFor="let option of displayedTags$ | async; index as idx" (isSelected)="true">
              <button class="plTagsComponent-option" type="button" (click)="selectResult(option)" (isSelected)="true"
                [ngClass]="{'focus-background': selectedIndex == idx}" (mouseenter)="onHover(idx) ">
                {{option.label}}
              </button>
            </ng-container>
          </cdk-virtual-scroll-viewport>

关于javascript - Angular ul,cdk-virtual-scroll-viewport 列表,键盘选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54743584/

相关文章:

angular - 如何在自定义组件中使用 DxTemplate

angularjs - 降级 Angular 2 服务时无法读取 null 的属性 'injector'

typescript - 在 TypeScript 中,什么是 !取消引用成员时使用(感叹号/感叹号)运算符?

javascript - 在弹出的 asp.net 中显示数据列表的结果

javascript - 将 Typeahead.js Bloodhound 与 Browserify 一起使用会给出空对象 {}

javascript - 如何迭代 mustache.js 中的哈希

angular - 如何在 angular-cli 的生产 dist 文件夹中捆绑延迟加载的组件?

angular - 农业网格 : how to implement filtering & sorting server side data?

javascript - 返回 false 不会阻止表单提交

typescript - Angular 2 : ReferenceError: require is not defined(…), angular2-polyfills