Otomatik tamamlama, metin kutusuna etiketsiz değer uygulama


86

Otomatik tamamlamanın düzgün çalışmasını sağlamaya çalışırken sorunlar yaşıyorum.

Bana her şey yolunda görünüyor ama ...

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

Ancak açılır menüden bir öğe seçtiğimde değer etiket yerine metin kutusuna uygulanıyor.

Neyi yanlış yaptım?

Firebug kullanarak kaynağa bakarsam, gizli alanımın doğru şekilde güncellendiğini görebilirim.


1
Firebug'daki JSON yanıtında ne görüyorsunuz?
SLaks

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

Yanıtlar:


216

Varsayılan davranışı selectolay güncelleştirmektir inputile ui.item.value. Bu kod çalışır sonra , olay işleyicinizden .

Bunun olmasını önlemek için geri dönün falseveya arayın event.preventDefault(). Ben de benzer bir şey yapıyor öneriyoruz focusönlemek için olay ui.item.valuekonuyor gelen inputseçimler üzerinden kullanıcı olarak gezinen:

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

Örnek: http://jsfiddle.net/andrewwhitaker/LCv8L/


1
Çok kullanışlı! Şunu demek istemedin mi$("#selected-customer").val(ui.item.value);
juanignaciosl

1
@juanignaciosl: Hayır - bu kod ile arama kutusunu güncellemek için kastedilmektedir labelyerine value.
Andrew Whitaker

Değeri db'de değil etikette depoluyorum, bu yüzden bir dahaki sefere değere göre etikete göre ayarlamak istiyorum. Bunu yapmanın yolu nedir?
parth.hirpara

1
Hey, benzer bir şey yapmak ama her şeyi koymak için çalışıyor focusyerine select. item.valueBunun yerine sorun ayarlanıyor item.label. Neyse, bunu aşmak için? 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

Burada da aynı şekilde etiketin görüntülenmesini istiyorum, değer POSTed. Gizli bir öğe içeren bir kludge'ı bir araya getirmeyi başardım (@Yang Zhang'ın aşağıdaki cevabına benzer, ancak bu noktada kendi otomatik tamamlamamı yuvarlamak en az mantıksız yaklaşım olacak.
Lori

15

Seçim ve odak geri çağırma işlevlerinde girdi öğesine "id" ile başvurmak yerine bu seçiciyi kullanabilirsiniz , örneğin:

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

birden çok öğe için otomatik tamamlama atadığınızda kullanışlıdır, yani sınıfa göre:

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

8

Benim durumumda, gizli bir girişe başka bir 'id' alanını kaydetmem gerekiyor. Bu yüzden ajax çağrısından dönen verilere başka bir alan ekliyorum.

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

Ve listenin altına bir 'yeni oluştur' bağlantısı ekledik. "Yeni oluştur" u tıkladığınızda, bir modal açılır ve oradan yeni öğe oluşturabilirsiniz.

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

Bence önemli olan, sadece 'etiket' ve 'değer' dışında herhangi bir ekstra veri alanı ekleyebilmenizdir.

Bootstrap modal kullanıyorum ve aşağıdaki gibi olabilir:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.