ユーザーの選択を、Bootstrap Typeaheadアイテムの事前定義されたデータソースアイテムに制限することは可能ですか?したがって、ユーザーがデータソースにないものを入力すると、そのことを通知するメッセージが表示されますか?
デモは次のとおりです:http://cruiseoutlook.com/test
ユーザーの選択を、Bootstrap Typeaheadアイテムの事前定義されたデータソースアイテムに制限することは可能ですか?したがって、ユーザーがデータソースにないものを入力すると、そのことを通知するメッセージが表示されますか?
デモは次のとおりです:http://cruiseoutlook.com/test
私が理解している場合、先行入力コンポーネントがフォーカスを失ったとき、それがリストにない場合、その入力が無効であることをユーザーに警告する必要がありますか?
したがって、コードは次のようになります。
var myData = [...]; // This array will contain all your possible data for the typeahead
$("#my-type-ahead").typeahead({source : myData})
.blur(validateSelection);
function validateSelection() {
if(source.indexOf($(this).val()) === -1)
alert('Error : element not in list!');
}
indexOf
IE6-8に実装されていないことに注意してください。しかし、シムを見つけることができます。たとえば、次のようになります。アイテムがJavaScript配列にあるかどうかを確認する最良の方法は?。
同じ問題が発生しましたが、私の状況では、すべてのデータがリモートでした。Bloodhoundには、これを可能にする現在認識している優れたフックはありませんが、ajaxの完全なコールバックにフックして、有効な入力キャッシュを手動で構築し、変更/ぼかしでそれを確認できます。
var myData = new Bloodhound({
remote: {
url: '/my/path/%QUERY.json',
ajax: {
complete: function(response){
response.responseJSON.forEach(function (item) {
if (myData.valueCache.indexOf(item.value) === -1) {
myData.valueCache.push(item.value);
}
});
}
}
}
});
myData.valueCache = [];
myData.initialize();
$('#artists .typeahead').typeahead(null, {
source: myData.ttAdapter()
}).bind('change blur', function () {
if (myData.valueCache.indexOf($(this).val()) === -1) {
$(this).val('');
}
});
jqueryとSamuelのソリューションを使用すると、IEの問題を克服できると思います。validateSelecion関数を次のように変更します。
function validateSelection() {
if ($.inArray($(this).val(), myData) === -1)
alert('Error : element not in list!');
}
サミュエルが指摘したように残りを残します。
私はこの問題を少し異なる方法で解決しました。ほとんどの場合、提案されたオプションのIDを取得したり、後続のWebサービス呼び出しに投稿したりする必要があります。
typeahead非同期呼び出しの開始時に非表示フィールドを空白にし、オートコンプリートまたは選択されたタイプヘッドイベントの非表示フィールドの値をdatum.idに設定することにしました。
フォームを送信するとき、非表示のフィールドに値があるかどうかを確認するだけです。値がない場合、ユーザーは提案されたオプションを選択しませんでした。
先行入力フィールドの名前に基づいて_idを追加して非表示フィールドに名前を付け、このコードをonAutocompleted関数とonSelected関数で使用しました
これらの関数を追加して指定しました。
.on('typeahead:selected', onAutocompleted)
.on('typeahead:autocompleted', onSelected)
入力フィールドに.typeahead機能を追加するコード内。
var n = $(this).attr('name')+'_id';
$('input[name="' + n + '"]').val(datum.id);
先行入力のドキュメントでは、オートコンプリートされ選択された関数に渡される3つのパラメーター、イベント、データム、および名前について説明していますが、名前が渡されるのを見たことがないため、$(this).attrを使用しました。 ('name')フィールドの名前を取得するメカニズム。