@Rock'n'museによって提案された回答に加えて、OPが投稿した回答は間違いなく良い提案ですが、どちらも重要で望ましい機能的側面を見逃しています。
change
@Matによって提供されたソリューションを利用し、@ Rock'n'museからの-vice-提案を実装するclose
場合、フィルター処理されたデータソースから選択が行われない場合、入力された値は実際にウィジェットからクリアされます。これは素晴らしい; ただし、ユーザーが有効なものを入力し、フィルターされたリストから値を選択した場合、値の最後にカーソルを置き、値を無効にするものを入力します(データソースから有効な選択を返しません)。入力された値はウィジェットからクリアされません。
何が起こっているのかというと、以前に入力された(そして有効な)値を変更する必要がある場合でも、isValid
値は残ります。これに対する解決策は、フィルタリングイベントがトリガーされるとすぐにtrue
に設定isValid
することです。false
ユーザーが入力された値を変更すると、ウィジェットは入力された値を検索するためにデータソースをフィルタリングしようとします。イベントがトリガーされるとすぐにに設定isValid
すると、@ Rock'n'museのソリューションで提案されているように、イベントの「クリーンな状態」が保証されます。false
filter
change
isValid
イベントがトリガーされるとすぐにfalseに設定するため、filtering
イベントでこれを行う必要はありませんopen
(ユーザーが選択するオプションを表示する前に、データソースのフィルタリングを行う必要があるため)。このため、open
イベントバインディングは@Matのソリューションから削除されました。false
これは、宣言時の最初の代入が不要であることも意味しますが、宣言isValid
時の変数代入は常に良い考えです。
以下は、@ Mattからの解決策と、@ Rock'n'museからの提案、およびfiltering
適用された実装です。
var isValid = false;
$("#staton").kendoAutoComplete({
minLength: 2,
dataTextField: "name",
select: function () {
valid = true;
},
change: function (e) {
// if no valid selection - clear input
if (!valid) {
e.sender.value("");
}
},
filtering: function () {
valid = false;
},
dataSource: datasource
});
補遺として、@ Matが提案するように、イベントバインディングを使用してselect
単純なブール値を設定および評価することは、入力された値がイベント内のデータソース。これは、@ Mat(このページ)から解決策を見つける前に解決策を検討する最初の考えでした。これが、彼の解決策と質問に賛成する理由です。$.each(...)
change