У меня возникают проблемы с попыткой правильной работы автозаполнения.
Все выглядит нормально для меня, но....
<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
. Этот код запускается после вашего обработчика событий.
Просто верните 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" внутри выберите и focus вы можете использовать этот селектор, например:
$(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>