使用键盘输入 md-select 中的 select 项

Using keyboard to select items in md-select

我正在使用 augular/material2 md-select。当我进入 md-select 组件时,我可以使用向上和向下箭头指向 select 项目。我还可以按 space 栏来查看列表,并使用上下箭头和回车键 select 一个项目。我不能做的是按一个项目的第一个字母并让该项目 selected.

使用 https://material.angular.io/components/component/select 上的示例,我希望能够切换到 md-select 组件并按 P 到 select 披萨。这不支持吗?有解决办法吗?

谢谢

在 material 文档中,仅支持以下键盘交互:

  • DOWN_ARROW: 关注下一个选项
  • UP_ARROW: 聚焦上一个选项
  • ENTER 或 SPACE:Select 重点项目

'press the first letter of an item and have that item selected'的功能很难实现,因为很难预测列表中可能存在多少首字母相同的项目。如果列表中有 PIZZA、POPCORN、PASTA 项,应按 'P' 选择哪个项?

如果您正在考虑按字母过滤项目,那么您可能想看看 md-autocomplte。

https://material.angular.io/components/component/autocomplete

这是我为处理这种情况而编写的 class,因为它不再作为默认实现工作。

class FindValue {
    lastIndex: number = -1;

    constructor(private _toString?: Function) {
    }

    findIndex(values, startIndex, char) {
        for (let ii = startIndex; ii < values.length; ii++) {
            let value;
            if (this._toString) {
                value = this._toString(values[ii]);
            } else {
                value = values[ii];
            }
            if (value && value.toLowerCase().startsWith(char)) {
                return ii;
            }
        }
        return -1;
    }

    find(values, char) {
        let value;
        let index = this.findIndex(values, this.lastIndex + 1, char);
        if (index < 0 && this.lastIndex >= 0) {
            index = this.findIndex(values, 0, char);
        }

        if (index >= 0) {
            this.lastIndex = index;
            return values[index];
        }

        return null;
    }
}

如果我将 (keypress)="selectKeyPress($event)" 添加到 mat-select 组件,然后我会像这样实现它。

constructor() {
    this.findValue = new FindValue(value => value.name);
}

selectKeyPress($event) {
    var inp = String.fromCharCode($event.keyCode);
    if (/[a-zA-Z]/.test(inp)) {
        let value = this.findValue.find(this.values, inp);
        if (value) {
            // Set the ngModel value to this value.
        }
    }
}

该对象将保持最后找到的索引的状态,这样它将循环遍历以按下的字母开头的所有项目,如果您连续按下同一个字母,如果它是最后一个,则再次回到第一个一。我的对象有一个名称属性,用于在 select 框中显示。如果您只有一个字符串对象,则可以在构造函数调用中省略该函数。