2017-05-19 11 views
1

私はaugular/material2 md-selectを使用しています。私がmd-selectコンポーネントにタブすると、上下の矢印を使って項目を選択できます。スペースバーを押してリストを表示し、上下矢印とEnterキーを使って項目を選択することもできます。私ができないことは、アイテムの最初の文字を押し、そのアイテムを選択させることです。キーボードでmd-selectの項目を選択する

https://material.angular.io/components/component/selectの例を使用すると、md-selectコンポーネントにタブで移動してPキーを押してピザを選択できることが期待されます。これはサポートされていませんか?回避策はありますか?材料docに

答えて

1

おかげで、唯一の次のキーボード相互作用がサポートされています。

  • DOWN_ARROW:フォーカス次のオプション
  • UP_ARROW:ENTERまたはSPACE
  • 前のオプションをフォーカス:フォーカスがあるアイテム
  • を選択します

'の機能は、アイテムの最初の文字その項目を選択しておくことは、予測が困難であるため、実装するのが難しいため、リスト内に同じ最初の文字を持つ項目がいくつあるのでしょうか。リストにPIZZA、POPCORN、PASTAの項目がある場合、どの項目を 'P'を押して選択する必要がありますか?

文字を押して項目をフィルタリングすることを考えている場合は、md-autocomplteを見たいと思うかもしれません。ここで

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

+4

標準のHTML SELECTのように動作することを期待していました。あなたの例を使ってPを押すと、PIZZAが得られます。もう一度Pを押すとPOPCORN、Pをもう一度押すと、PASTAが得られます。これは長い間HTMLの標準的な動作でしたので、Material Design for Angularがこれをサポートしていないことは残念です。私がオートコンプリートを使用している問題は、リスト内の項目のみを選択させるオプションが見つからないということです。私はフィルタリングの後ではありません。例えば、国のリストなどの長いリストで項目をすばやく選択し、コンポーネントの値に無効な値を持たない方法です。 – Craig

+0

また、リスト内の項目を選択するキープレスは、材料1でこのように機能しました。これは、材料構成要素に悩まされているユーザーのためのユーザー能力の損失です。これを追加してください。 – crowmagnumb

+0

文書化されていないが、キーボード入力検索による選択をサポートしているようだ。例を試してみてください:https://material.angular.io/components/select/overview – Derek

0

それはもはやデフォルトの実装として動作しますので、私はこのケースを処理するために書いていないクラスがあります。

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

ように最後に見つかったインデックスの状態を保持するオブジェクト、それはあなたが連続して同じ文字を押して、それがある場合は、最初に再び集まってくる場合には、押された文字で始まるすべての項目を循環最後のもの私のオブジェクトには、選択ボックスに表示するために使用する名前属性がありました。文字列オブジェクトだけの場合は、コンストラクタ呼び出しでその関数を省略することができます。

関連する問題