Tự động hoàn thành áp dụng giá trị không phải nhãn cho hộp văn bản


86

Tôi đang gặp sự cố khi cố gắng làm cho tính năng tự động hoàn tất hoạt động bình thường.

Tất cả có vẻ ổn đối với tôi nhưng ...

<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")

Tuy nhiên, khi tôi chọn một mục từ menu thả xuống, giá trị sẽ được áp dụng cho hộp văn bản thay vì nhãn.

Tôi đã làm gì sai?

Nếu tôi xem nguồn bằng firebug, tôi có thể thấy rằng trường ẩn của tôi đang được cập nhật chính xác.


1
Bạn thấy gì trong phản hồi JSON trong Firebug?
SLaks

[{"label": "Tom Smith", "value": "1234"}, {"label": "Tommy Smith", "value": "12321"}]
Diver Dan

Câu trả lời:


215

Hành vi mặc định của selectsự kiện là cập nhật inputvới ui.item.value. Mã này chạy sau trình xử lý sự kiện của bạn.

Chỉ cần quay lại falsehoặc gọi event.preventDefault()để ngăn điều này xảy ra. Tôi cũng khuyên bạn nên làm điều gì đó tương tự cho focussự kiện để tránh ui.item.valuebị đưa vào inputkhi người dùng di chuột qua các lựa chọn:

$("#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);
    }
});

Ví dụ: http://jsfiddle.net/andrewwhitaker/LCv8L/


1
Rất hữu dụng! Không có nghĩa là bạn$("#selected-customer").val(ui.item.value);
juanignaciosl

1
@juanignaciosl: Không - mã đó dùng để cập nhật hộp tìm kiếm labelthay vì value.
Andrew Whitaker

Tôi đang lưu trữ giá trị tại db không phải nhãn, Vì vậy, lần tới tôi muốn đặt theo lable trên cơ sở giá trị. Cách làm như vậy là gì?
parth.hirpara

1
Này, đang cố gắng làm điều gì đó tương tự nhưng focusthay vì đưa mọi thứ vào select. Vấn đề đang item.valueđược đặt ra thay vì item.label. Dù sao để phá vỡ điều này? lookup.autocomplete({ source: data, focus: function(event, ui) { event.preventDefault(); $(this).val(ui.item.label) status.text(ui.item.value) submitted.text(ui.item.submitted) comments.html(ui.item.comments) } })
dơi

Tương tự ở đây, tôi muốn nhãn được hiển thị, giá trị ĐÃ ĐĂNG. Tôi đã quản lý để vá lại với nhau một kludge có yếu tố ẩn (tương tự như câu trả lời @Yang Zhang dưới đây, nhưng vào thời điểm này nó trông như cán autocomplete của riêng tôi sẽ là cách tiếp cận không thanh nha nhất.
Lori

15

Chỉ muốn thêm rằng thay vì tham chiếu phần tử đầu vào bằng "id" bên trong các hàm gọi lại chọntiêu điểm, bạn có thể sử dụng bộ chọn này , như:

$(this).val(ui.item.label);

nó hữu ích khi bạn gán tính năng tự động hoàn thành cho nhiều phần tử, tức là theo lớp:

$(".className").autocomplete({
...
    focus: function(event, ui) {
        event.preventDefault();
        $(this).val(ui.item.label);
    }
});

8

Trong trường hợp của tôi, tôi cần ghi lại một trường khác 'id' trong một đầu vào ẩn. Vì vậy, tôi thêm một trường khác trong dữ liệu trả về từ cuộc gọi ajax.

{label:"Name", value:"Value", id:"1"}

Và đã thêm liên kết 'tạo mới' ở cuối danh sách. Khi nhấp vào 'tạo mới', một phương thức sẽ bật lên và bạn có thể tạo mục mới từ đó.

$('#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');
            }
        }
    );

Tôi nghĩ vấn đề là bạn có thể thêm bất kỳ trường dữ liệu bổ sung nào ngoài 'nhãn' và 'giá trị'.

Tôi sử dụng phương thức bootstrap và nó có thể như sau:

<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>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.