Completamento automatico applicando valore non etichetta alla casella di testo


86

Ho problemi nel tentativo di far funzionare correttamente il completamento automatico.

Mi sembra tutto a posto ma ...

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

Tuttavia, quando seleziono un elemento dal menu a discesa, il valore viene applicato alla casella di testo anziché all'etichetta.

Cosa ho fatto di sbagliato?

Se guardo la fonte usando Firebug posso vedere che il mio campo nascosto viene aggiornato correttamente.


1
Cosa vedi nella risposta JSON in Firebug?
SLaks

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

Risposte:


215

Il comportamento predefinito selectdell'evento è aggiornare il inputcon ui.item.value. Questo codice viene eseguito dopo il gestore di eventi.

Basta tornare falseo chiamare event.preventDefault()per evitare che ciò accada. Consiglierei anche di fare qualcosa di simile per l' focusevento per evitare che ui.item.valuevenga inserito nel inputmentre l'utente passa il mouse sulle scelte:

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

Esempio: http://jsfiddle.net/andrewwhitaker/LCv8L/


1
Molto utile! Non intendevi$("#selected-customer").val(ui.item.value);
juanignaciosl

1
@juanignaciosl: No, il codice ha lo scopo di aggiornare la casella di ricerca con labelinvece di value.
Andrew Whitaker

Sto memorizzando il valore in db non in etichetta, quindi la prossima volta voglio impostare secondo lable in base al valore. Qual è il modo per farlo?
parth.hirpara

1
Ehi, provo a fare qualcosa di simile ma metti tutto al focusposto di select. Il problema è item.valuestato impostato invece di item.label. Comunque per aggirare questo? 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

Lo stesso qui, voglio che venga visualizzata l'etichetta, valore POSTed. Sono riuscito a mettere insieme un kludge che coinvolge un elemento nascosto (simile alla risposta di @Yang Zhang di seguito, ma a questo punto sembra che rotolare il mio completamento automatico sarà l'approccio meno inelegante.
Lori

15

Vorrei solo aggiungere che invece di fare riferimento all'elemento di input con "id" all'interno delle funzioni di callback di selezione e messa a fuoco puoi usare questo selettore, come:

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

è utile quando si assegna il completamento automatico a più elementi, ad esempio per classe:

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

8

Nel mio caso, ho bisogno di registrare un altro campo "id" in un input nascosto. Quindi aggiungo un altro campo nei dati restituiti dalla chiamata ajax.

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

E hanno aggiunto un collegamento "crea nuovo" in fondo all'elenco. Facendo clic su "crea nuovo", verrà visualizzato un modale da cui è possibile creare un nuovo elemento.

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

Penso che il punto sia che puoi aggiungere qualsiasi campo dati extra oltre a "etichetta" e "valore".

Uso il bootstrap modal e può essere il seguente:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.