コンボボックスコンポーネントをライブラリに追加します。
私たちはたくさんのデータを扱っています。 私たちのdt-selectは、実際には多くのオプションセットでは機能しません。 dt-selectの検索機能は、ネイティブselectの場合と同じです。 したがって、ユーザーは、ユーザーが押したキーで始まるオプションにのみジャンプできます。
これは、大規模なデータセットを使用するユースケースでは実際に制限されます。
dt-autocompleteがアタッチされた入力から構築できるコンボボックスコンポーネントは、そこで役立ちます。
入力には、プレースホルダーテキストを表示する必要があります。
コンボボックスは、dt-selectと同じスタイルを使用する必要があります。
ドロップダウンをクリックすると、ユーザーが選択できるいくつかの項目のリストが開き、カーソルが入力フィールドに置かれます。 ユーザーがコンボボックスの入力を開始するとすぐに、デバウンスされたイベントが発行され、フィルターフィールドに既にあるものと同様の読み込みインジケーターが入力内に表示されます。
アイテムが選択されると、ドロップダウンが閉じ、それに応じて入力フィールドが更新されます。
コンボボックスの最初のバージョンでは、仮想スクロールについて心配しないことをお勧めします。 アイテムのフィルタリングはサーバー側で行われることが期待できます。 クライアントに入力されたアイテムをレンダリングできます。 2番目のバージョンでは、大きなデータセットの処理を改善できます。
最初のバージョンでは、dt-autocompleteを使用することをお勧めしますが、データリストを使用して簡略化されたドロップダウンを作成することを検討する必要があります。
アクセシビリティのリファレンスとして、リストボックスポップアップを備えたWAI-ARIAコンボボックスからのベストプラクティスの推奨事項を検討してください
APIプロポーザルコンボボックス
高度な構造
<dt-combobox [value]="initialValue" (valueChanges)="fn($event)" (filterChanges)="fn($event)" [placeholder]="'Type here for filter'">
<dt-option *ngFor="let option of options">{{ option.value }} </dt-option>
</dt-combobox>
入力
| 名前| タイプ| 説明|
| ------------- | ------------- | ------------- |
| value
| string \| undefined
| 入力の初期値|
| placeholder
| string \| undefined
| 入力のプレースホルダー|
出力
| 名前| タイプ| 説明|
| ------------- | ------------- | ------------- |
| valueChanges
| EventEmitter<string>
| 新しい値が選択されたときに発行されるイベント|
| filterChanges
| EventEmitter<string>
| フィルタが変更されたときに発行されるイベント|
コンテンツの投影
dt-オプション
dt-optgroup
チェックリスト
ねえ@ lukett89 、APIの提案をありがとう。 本当に素晴らしい出発点。
dt-select
とまったく同じ入力が必要になると思います。
追加します
| 名前| タイプ| 説明|
| ------------- | ------------- | ------------- |
| id
| string
| 選択のID |
| compareWith
| (v1: T, v2: T) => boolean
| オプション値を選択した値と比較する関数|
| required
| boolean
| 入力が必要かどうか|
| panelClass
| string
| コンボボックスのドロップダウンにクラスが追加されました|
「opened」のような開いた状態のゲッターを追加し、その状態が変化したときに出力することも検討する必要があります。
選択に最も近いAPIに固執して、どちらか一方をできるだけ簡単に切り替えることができれば有益だと思います。
返信ありがとうございます@ ffriedl89。
コンポーネントの最初のバージョンについて言及したすべての入力/出力を考慮に入れます。
最終的なAPI提案コンボボックス
高度な構造
<dt-combobox [value]="initialValue" (valueChanges)="fn($event)" (filterChanges)="fn($event)" [placeholder]="'Type here for filter'">
<dt-option *ngFor="let option of options">{{ option.value }} </dt-option>
</dt-combobox>
入力
| 名前| タイプ| 説明|
| ------------- | ------------- | ------------- |
| value
| string \| undefined
| 入力の初期値|
| placeholder
| string \| undefined
| 入力のプレースホルダー|
| id
| 文字列| 選択のID |
| compareWith
| (v1: T, v2: T) => boolean
| オプション値を選択した値と比較する関数|
| required
| boolean
| 入力が必要かどうか|
| panelClass
| string
| コンボボックスのドロップダウンにクラスが追加されました|
出力
| 名前| タイプ| 説明|
| ------------- | ------------- | ------------- |
| valueChanges
| EventEmitter<string>
| 新しい値が選択されたときに発行されるイベント|
| filterChanges
| EventEmitter<string>
| フィルタが変更されたときに発行されるイベント|
| openedChange
| EventEmitter
コンテンツの投影
dt-オプション
dt-optgroup
チェックリスト
今後2週間以内にこの機能の実装を担当したいと思います。 問題を私に割り当ててもらえますか?
同期と@heartdiseaseと@ lukett89との話し合いの後、私は問題を再割り当てしています。
さらに2つの入力を追加することを提案します。
| 名前| タイプ| デフォルト値| 説明|
| --- | --- | --- | --- |
| 読み込み中| boolean
| false
| trueに設定すると、データが現在ロード/フィルタリングされていることをユーザーに示すために、ロードインジケーターが表示されます。
| displayWith | (value: T) => string
| (value: T) =>
$ {value} `` | コンボボックスからのオプションを表す、指定されたオブジェクトの表示名を返す関数|
displayWith関数は、オブジェクトでコンボボックスを使用することに関連しており、ロードインジケーターは、ほとんどの場合、サーバー側にフィルタリングをオフロードするコンポーネントに対して保証されているようです。
最も参考になるコメント
さらに2つの入力を追加することを提案します。
| 名前| タイプ| デフォルト値| 説明|
| --- | --- | --- | --- |
| 読み込み中|
boolean
|false
| trueに設定すると、データが現在ロード/フィルタリングされていることをユーザーに示すために、ロードインジケーターが表示されます。| displayWith |
(value: T) => string
|(value: T) =>
$ {value} `` | コンボボックスからのオプションを表す、指定されたオブジェクトの表示名を返す関数|displayWith関数は、オブジェクトでコンボボックスを使用することに関連しており、ロードインジケーターは、ほとんどの場合、サーバー側にフィルタリングをオフロードするコンポーネントに対して保証されているようです。