Mam migrację do select2 to use as a tagging plugin z innej wtyczki, ale jest jedna luka, którą próbuję dowiedzieć się, czy select2 może obsługiwać.Z pluginem select2 jquery z tagami: true, jak można zapobiec wyświetlaniu opcji w menu, które jest już zaznaczone?
Spójrzmy na przykład. Powiedzmy, że moja lista wyborów (wracających po stronie serwera z żądania Ajax)
"Dog", "Cat", "Monkey", "Giraffe"
W starej wtyczki używam, po tym, jak wybrać jedną z opcji (powiedzmy „Kot”) i pokazuje się w w polu tekstowym, gdy następnym razem wyszukuję ten sam częściowy ciąg znaków (powiedzmy "Ca"), TO NIE "T" Cat "pojawi się w menu rozwijanym opcji (ponieważ wie, że już wcześniej wybrałeś)
Wygląda na to, że select2 nadal pokazuje pozycję w liście rozwijanej podczas wyszukiwania, niezależnie od tego, czy już ją wybrałeś. Opcja2 uniemożliwia wprowadzanie, jeśli po naciśnięciu klawisza Enter, ale wydaje się to nieco nieintuicyjne, więc próbuję ustalić, czy jest jakiś sposób dla select2 do replikowania tego samego behav i lub z drugiej wtyczki (gdzie opcje nie pojawiają się)
Jako kolejny przykład tego działającego poprawnie, sekcja znacznika stackoverflow pytania również robi właściwą rzecz. Jeśli dodaję "jquery" do mojej listy znaczników dla tego pytania, a następnie ponownie wyszukam "jquery", to DOESN "T pokazuje, że na liście (jak już wybrano) .To jest zachowanie, którego szukam dla
Tu jest mój bieżący kod select2.
HTML:
<select id="Tags" name="Tags" multiple="multiple">
</select>
JavaScript:
function SetupAppTags() {
$("#Tags").select2({
theme: "classic",
width: "98%",
tags: true,
ajax: {
url: "/Tag/Search",
dataType: 'json',
delay: 300,
data: function(params) {
return { q: params.term };
},
processResults: function(data, params) {
return { results: data };
},
cache: false
},
escapeMarkup: function(markup) { return markup; },
minimumInputLength: 3,
templateResult: tagFormatResult,
templateSelection: tagSelectionResult
});
}
function tagFormatResult(tag) {
if (tag.loading) {
return "Loading . . .";
} else {
if (tag.name) {
return tag.name;
}
return tag.text + " [NEW]";
}
}
function tagSelectionResult(tag) {
if (tag.name) {
return tag.name;
}
return tag.text;
}
Myślę, że w jakiś sposób w funkcji templateResult istnieje sposób zwracania fałszu lub czegoś, co nie pokazuje tego elementu, jeśli jest już wybrany. Czy coś takiego jest możliwe (nie mogę znaleźć coś w Internecie lub w docs)
czy wiesz, co różnica między niestandardowym dopasowaniem a zwracanym znakiem null w funkcji templateResult? – leora
@leora Przeglądałem dokumenty i robiłem niektóre debugowanie, obie są możliwymi opcjami, ponieważ oferują nieco powieloną funkcjonalność. Z dokumentacji: _ "[Select2 używa]' matcher' do określenia, czy [każdy wynik] powinien być wyświetlony. "_ _" Zwrot "templateResult" może również zwrócić 'null', co uniemożliwi wyświetlenie opcji w lista wyników. "_ Tak więc, jak widać, pozwalają one użytkownikowi robić to samo na różnych trasach. Dlaczego biblioteka została zaprojektowana w ten sposób, nie jest zbyt jasna, ale prawdopodobnie chodzi o łatwość użycia, jeśli chcesz zmienić tylko jedną lub drugą w drobnych szczegółach. – Nit
Dzięki za kontynuację – leora