Autouzupełnianie z zastosowaniem wartości nie etykiety do pola tekstowego


86

Mam problemy z próbą uzyskania prawidłowego działania autouzupełniania.

Dla mnie wszystko wygląda dobrze, ale ....

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

Jednak gdy wybiorę element z listy rozwijanej, wartość zostanie zastosowana do pola tekstowego zamiast etykiety.

Co zrobiłem źle?

Jeśli spojrzę na źródło za pomocą firebuga, widzę, że moje ukryte pole jest poprawnie aktualizowane.


1
Co widzisz w odpowiedzi JSON w Firebug?
— SLaks

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

Odpowiedzi:


215

Domyślnym zachowaniem selectzdarzenia jest aktualizacja za inputpomocą ui.item.value. Ten kod jest uruchamiany po programie obsługi zdarzeń.

Po prostu wróć falselub zadzwoń, event.preventDefault()aby temu zapobiec. Poleciłbym również zrobić coś podobnego w focusprzypadku zdarzenia, aby zapobiec ui.item.valueumieszczaniu go w polu, inputgdy użytkownik najedzie kursorem na opcje:

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

Przykład: http://jsfiddle.net/andrewwhitaker/LCv8L/


1
Bardzo przydatne! Czy nie $("#selected-customer").val(ui.item.value);
— chodziło

1
@juanignaciosl: Nie - ten kod ma na celu aktualizację pola wyszukiwania za pomocą labelzamiast value.
— Andrew Whitaker

Przechowuję wartość w db nie etykiecie, więc następnym razem chcę ustawić zgodnie z etykietą na podstawie wartości. Jaki jest na to sposób?
— parth.hirpara

1
Hej, próbuję zrobić coś podobnego, ale focuszamiast tego włóż wszystko select. Problem jest item.valueustawiany zamiast item.label. W każdym razie, aby to obejść? 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) } })
— Batman

To samo tutaj, chcę wyświetlić etykietę, wartość POST. Udało mi się połączyć ze sobą kludge obejmujący ukryty element (podobnie jak odpowiedź @Yang Zhang poniżej, ale w tym momencie wygląda na to, że użycie własnego autouzupełniania będzie najmniej nieeleganckim podejściem.
— Lori

15

Chciałbym tylko dodać, że zamiast odwoływać się do elementu wejściowego przez „id” wewnątrz funkcji wywołania zwrotnego zaznaczania i ustawiania ostrości , możesz użyć tego selektora, na przykład:

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

jest to przydatne, gdy przypisujesz autouzupełnianie do wielu elementów, tj. według klas:

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

8

W moim przypadku muszę zapisać kolejne pole „id” w ukrytym wejściu. Więc dodaję kolejne pole w danych zwróconych z wywołania ajax.

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

Dodałem link „utwórz nowy” u dołu listy. Po kliknięciu `` utwórz nowy '', pojawi się modal, z którego możesz utworzyć nowy element.

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

Myślę, że chodzi o to, że możesz dodać dodatkowe pole danych inne niż tylko „etykieta” i „wartość”.

Używam modalu bootstrap i może być jak poniżej:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.