【问题标题】:Angular ul, cdk-virtual-scroll-viewport list, keyboard selectionAngular ul、cdk-virtual-scroll-viewport 列表、键盘选择
【发布时间】:2019-02-18 08:59:16
【问题描述】:

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

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

示例: - 用户输入“侯” - 选项显示 ["House", "Houston"] - 用户点击down键盘键并点击enter来选择“house”

我的弹出滚动组件:

<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>

【问题讨论】:

    标签: javascript angular typescript angular-cdk


    【解决方案1】:

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

    我使用了来自 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>
    

    【讨论】:

    • 如果用户一直按下直到所选的一个低于可见区域,你的解决方案是什么?您需要以某种方式检测所选项目不可见并将其滚动回视图。
    • @Halt 你是对的,这是一个问题,在我的情况下选项只是几个,所以我没有遇到这个问题
    猜你喜欢
    • 2019-08-03
    • 2019-10-26
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 2020-07-27
    • 1970-01-01
    相关资源
    最近更新 更多