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.