オートコンプリートを適切に機能させようとすると問題が発生します。
それはすべて私には大丈夫に見えますが....
<script>
$(function () {
$("#customer-search").autocomplete({
source: 'Customer/GetCustomerByName',
minLength: 3,
select: function (event, ui) {
$("#customer-search").val(ui.item.label);
$("#selected-customer").val(ui.item.label);
}
});
});
</script>
<div>
<input id="customer-search" />
</div>
@Html.Hidden("selected-customer")
ただし、ドロップダウンからアイテムを選択すると、ラベルではなくテキストボックスに値が適用されます。
私は何を間違えましたか?
Firebugを使用してソースを見ると、非表示フィールドが正しく更新されていることがわかります。
select
イベントのデフォルトの動作は、input
を_ui.item.value
_で更新することです。このコードは、イベントハンドラーのafterで実行されます。
これを防ぐには、単にfalse
を返すか、event.preventDefault()
を呼び出します。また、focus
イベントに対して同様の操作を行って、ユーザーが選択肢にカーソルを合わせたときに_ui.item.value
_がinput
に配置されないようにすることをお勧めします。
_$("#customer-search").autocomplete({
/* snip */
select: function(event, ui) {
event.preventDefault();
$("#customer-search").val(ui.item.label);
$("#selected-customer").val(ui.item.label);
},
focus: function(event, ui) {
event.preventDefault();
$("#customer-search").val(ui.item.label);
}
});
_
内部で「id」によって入力要素を参照する代わりにそれを追加したいだけです 選択する そして フォーカス 使用できるコールバック関数 この セレクター:
$(this).val(ui.item.label);
クラスごとに複数の要素にオートコンプリートを割り当てると便利です:
$(".className").autocomplete({
...
focus: function(event, ui) {
event.preventDefault();
$(this).val(ui.item.label);
}
});
私の場合、非表示の入力に別のフィールド「id」を記録する必要があります。そこで、ajax呼び出しから返されたデータに別のフィールドを追加します。
{label:"Name", value:"Value", id:"1"}
リストの下部に「新規作成」リンクを追加しました。 「新規作成」をクリックすると、モーダルがポップアップ表示され、そこから新しいアイテムを作成できます。
$('#vendorName').autocomplete
(
{
source: "/Vendors/Search",
minLength: 2,
response: function (event, ui)
{
ui.content.Push
({
label: 'Add a new Name',
value: 'Add a new Name'
});
},
select: function (event, ui)
{
$('#vendorId').val(ui.item.id);
},
open: function (event, ui)
{
var createNewVendor = function () {
alert("Create new");
}
$(".ui-autocomplete").find("a").last().attr('data-toggle', 'modal').addClass('highLight');
$(".ui-autocomplete").find("a").last().attr('href', '#modal-form').addClass('highLight');
}
}
);
ポイントは、「ラベル」と「値」以外のデータフィールドを追加できることだと思います。
私はbootstrap modalを使用し、以下のようになります:
<div id="modal-form" class="modal fade" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-body">
<div class="row">
</div>
</div>
</div>
</div>