2010-08-11 11 views
14

Ich verwende das AutoVervollständigen-UI-Widget für ein Formular, damit Benutzer einen Kundennamen eingeben können. Die Idee ist, dass sie entweder einen bestehenden Kunden auswählen und andere Felder im Formular ausfüllen können, oder sie können einen neuen Kunden frei geben, der erstellt werden soll. Wenn ein Benutzer einen vorhandenen Kunden auswählt, verwende ich das Ereignis select, um eine versteckte Eingabe zu füllen, um die mit diesem Kunden verknüpfte ID zu speichern.JQuery UI Autocomplete-Änderungsereignis - Zurücksetzen der Auswahl ID

Das Problem, das ich habe, ist, wenn ein Benutzer zunächst einen Kunden aus der Liste auswählt, dann aber den Text bearbeitet und bearbeitet und damit einen neuen Kunden erstellt, muss ich den versteckten Eingabe-ID-Wert löschen können .

I bezeichnet this SO question und erstellt den folgenden Code:

$(function() { 
      $("#customerName").autocomplete({ 
       source: "/Customers/CustomerListJSON", 
       minLength: 2, 
       select: function(event, ui) { 
        $("#customerId").val(ui.item ? ui.item.Id : ""); 
       }, 
       change: function(event, ui) { 
        try { 
         $("#trace").append(document.createTextNode(event.originalEvent.type + ", ")); 
         if (event.originalEvent.type != "menuselected") 
          $("#customerId").val(""); 
        } catch (err) { 
         $("#customerId").val(""); 
        } 
       } 
      }); 
     }); 

Das Problem ist, dass das Änderungsereignis auf blur abgefeuert wird, so dass, wenn ein Benutzer einen Kunden wählt, der versteckte Eingabewert gefüllt wird, sondern als sobald sie den Fokus von der Eingabebox wegbewegen, wird sie sofort gelöscht. Wenn ich jedoch das blur-Ereignis vom event.originalEvent.type-Test ausschließe, wird der Wert des versteckten Felds im ursprünglichen Szenario, in dem ein Benutzer einen zuvor ausgewählten Wert bearbeitet, nie zurückgesetzt.

Hat jemand hatte diese vor zu bekämpfen, und wenn ja, können Sie einige Hinweise geben, wie ich diesen Wert verborgenen Eingang verwalten, so dass es nur bevölkert ist, wenn ein Element aus der Liste ausgewählt und mit einem anderen Wert gelöscht?

Antwort

29

Sieht so aus, als hätte ich das ziemlich schnell alleine gelöst. Unter Bezugnahme auf die JQuery UI wiki, das ui Element in der change Veranstaltung ist das gleiche in dem select Fall, so kann ich meinen Code ändern wie folgt zu lesen:

$(function() { 
    $("#customerName").autocomplete({ 
     source: "/Customers/CustomerListJSON", 
     minLength: 2, 
     select: function(event, ui) { 
      $("#customerOrganizationId").val(ui.item ? ui.item.Id : ""); 
     }, 
     change: function(event, ui) { 
      $("#customerOrganizationId").val(ui.item ? ui.item.Id : ""); 
     } 
    }); 
}); 

Es gibt keine Notwendigkeit für den Fall zu prüfen, nur für ob es einen Artikel im ui Argument gibt. Die ID-Einstellung im select Event ist wahrscheinlich überflüssig, aber um sicher zu sein, werde ich beides behalten.

+0

Cool! Ich habe die gleiche Notwendigkeit, aber jetzt brauche ich mehrere automatische Vervollständigung, also zum Beispiel, wenn ich 'customer1' wähle, würde seine ID in das versteckte Feld gesetzt werden, jetzt tippe ich' abcd', jetzt trigger ich die automatische Vervollständigung und wähle 'customer2' so seins aus ID sollte gedrückt werden, jetzt, wenn ich 'customer2' entferne, sollte nur seine ID aus der versteckten Liste entfernt werden, irgendwelche schnellen Gedanken? –

+0

Es klingt, als ob Sie etwas wie die Tagging-Tools suchen. Das Autocomplete-Tool wird dies tun, aber es ist nicht schön. Ich bevorzuge so etwas: http://webspirited.com/tagit/#demos. Es gibt ein paar Kontrollen wie diese da draußen ... Tagit ist nur einer, den ich in der Vergangenheit erfolgreich eingesetzt habe. –

+0

Es hilft, aber es sollte auch Inhalt, also wenn ich Trigger-String verwenden, sollte es die automatische Vervollständigung nicht sonst –

0
$(function() { 
$("#customerName").autocomplete({ 
    source: "/Customers/CustomerListJSON", 
    minLength: 2, 
    select: function(event, ui) { 
     $("#customerId").val(ui.item ? ui.item.Id : ""); 
    }, 
    change: function(event, ui) { 
     try { 
      $("#trace").append(document.createTextNode(event.originalEvent.type + ", ")); 
      if (event.originalEvent.type != "menuselected") 
       $("#customerId").val(""); 
     } catch (err) { 
      $("#customerId").val(""); 
     } 
    } 
}); 
}); 
Verwandte Themen