Wählen Sie 2 Custom Matcher, um die Optionen offen zu lassen, wenn der Gruppentitel übereinstimmt

8

Ich hoffe, dass meine Frage einen Sinn ergibt - ich war mir nicht sicher, wie ich das am besten beschreiben könnte. Ich habe eine gruppierte Select2 Select-Formular-Eingabe etwa wie folgt:

  • Gemüse
  • Salat
  • Tomaten
  • Zwiebeln
  • Frucht
  • Äpfel
  • Orangen
  • Bananen
  • Aufteilungen
  • Vegemite
  • Nutella
  • Erdnussbutter

Du fängst also an, App einzugeben, und natürlich bekommst du Apples aus dem Drop-down Select2. Wenn Sie veg eingeben, erhalten Sie Vegemite und die Vegetables Gruppenüberschrift, aber alle Optionen sind ausgeblendet. Ich möchte alle Gruppenoptionen sichtbar lassen, wenn ein Suchbegriff mit der Gruppenüberschrift übereinstimmt.

Ich habe etwas im Quellcode von select2 gegraben und ich denke, dass es eigentlich einfach ist, aber ich könnte falsch liegen und wenn ich recht habe, bleibe ich dran, wie ich es zum Laufen bringen kann. Hier ist der Quellcode:   Ссылка :

und ein von mir erstellter Gist im Gegensatz zu dem Versuch, ihn hier einzufügen:

Ссылка

Ich habe die Reihenfolge des Codes geändert und einige geringfügige Namensänderungen vorgenommen, um dies widerzuspiegeln. Ich denke, das würde die Optionsgruppe offen halten. Ich habe versucht, einen benutzerdefinierten Matcher basierend darauf zu erstellen (siehe mein Gist), aber ich steckte an dem Punkt fest, an dem es DIACRITICS :

aufgerufen hat

Ссылка

Nach einigem Googeln wurde mir klar, dass dies Akzentbuchstaben ersetzt, von denen ich weiß, dass ich sie nicht habe, also habe ich diesen Teil entfernt.

Jetzt schlägt mein Matcher mit TypeError: data.indexOf is not a function. (In 'data.indexOf(term)', 'data.indexOf' is undefined) Fehlern in meinem Browser fehl.

Ich bin mir sicher, dass ich mir hier sehr nahe bin, aber ich bin ein bisschen über meinen Kopf und jenseits meiner Erfahrung und / oder Fähigkeiten, um das zu beenden. Alle Hinweise oder Ideen würden geschätzt.

AKTUALISIEREN

Hier ist eine JSfiddle mit was ich arbeite:

Ссылка

    
Dan Tappin 13.03.2016, 04:50
quelle

1 Antwort

10

Was ich aus Ihrer Frage entnehme, ist, dass Sie option s zur Auswahl anzeigen können, wenn eine Übereinstimmung in option text ODER option des übergeordneten Attributs optgroup besteht.

Das ist relativ einfach: Betrachte hauptsächlich beide Werte und wenn beide übereinstimmen, return true mit der Option matcher von Select2:

(Hinweis: Verwenden von Select2 v3.5.4.)

%Vor%

Ссылка

v4. * und höher haben term und text zu einem komplexeren Objekt geändert, so dass es etwas anders aussieht, aber das Hauptkonzept ist dasselbe. Wie Sie sehen können, benutze ich nur jQuery, um bis zum übergeordneten Element option zu selektieren, wenn es sich um ein optgroup -Element handelt, und dieses in die matcher -Kontrolle einzubeziehen.

Außerdem wird ein optgroup an, wenn irgendetwas davon Kinder angezeigt, so dass Sie nur über Anzeigen eines oder mehrerer des option 's kümmern, und nicht wirklich ‚show‘% des% co_de durch manuelle zeigt es.

Wenn Sie eine andere Anforderung haben, stellen Sie bitte eine (funktionierende / nicht funktionierende?) Demonstrationsgeige zur Verfügung, die zeigt, wo Sie sie haben können.

BEARBEITEN

Die benutzerdefinierte Anpassung von Select2 wurde mit Version 4.0 erheblich geändert. Hier ist ein eigener Matcher, die auf diese GitHub Ausgabe gebucht wurde. Es ist, wie folgt, zur Vollständigkeit wiedergegeben.

Beachten Sie, dass es für sich selbst untergeordneten Elemente ruft (die optgroup Elemente innerhalb der option Elemente), so optgroup läuft sowohl gegen die modelMatcher() und die optgroup Elemente , aber die kombinierte Menge wird zurückgegeben, nachdem die Elemente option und optgroup entfernt wurden, die nicht übereinstimmen. In der obigen Version haben Sie jedes option -Element erhalten und haben einfach true / false zurückgegeben, wenn Sie es (und das übergeordnete Element) anzeigen wollten. Nicht das viel komplizierter, aber Sie müssen darüber ein wenig mehr nachdenken.

%Vor%

Ссылка

    
Jared Farrish 17.03.2016, 01:57
quelle