それはもはやデフォルトの実装として動作しますので、私はこのケースを処理するために書いていないクラスがあります。
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;
}
}
私はmat-select
コンポーネントに(keypress)="selectKeyPress($event)"
を追加した場合、私はこのようなものを実装しています。
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.
}
}
}
ように最後に見つかったインデックスの状態を保持するオブジェクト、それはあなたが連続して同じ文字を押して、それがある場合は、最初に再び集まってくる場合には、押された文字で始まるすべての項目を循環最後のもの私のオブジェクトには、選択ボックスに表示するために使用する名前属性がありました。文字列オブジェクトだけの場合は、コンストラクタ呼び出しでその関数を省略することができます。
標準のHTML SELECTのように動作することを期待していました。あなたの例を使ってPを押すと、PIZZAが得られます。もう一度Pを押すとPOPCORN、Pをもう一度押すと、PASTAが得られます。これは長い間HTMLの標準的な動作でしたので、Material Design for Angularがこれをサポートしていないことは残念です。私がオートコンプリートを使用している問題は、リスト内の項目のみを選択させるオプションが見つからないということです。私はフィルタリングの後ではありません。例えば、国のリストなどの長いリストで項目をすばやく選択し、コンポーネントの値に無効な値を持たない方法です。 – Craig
また、リスト内の項目を選択するキープレスは、材料1でこのように機能しました。これは、材料構成要素に悩まされているユーザーのためのユーザー能力の損失です。これを追加してください。 – crowmagnumb
文書化されていないが、キーボード入力検索による選択をサポートしているようだ。例を試してみてください:https://material.angular.io/components/select/overview – Derek