2015-09-26 17 views
9

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)

Odpowiedz

5

It brzmi jak szukasz a custom matcher. Korzystanie z nich pozwoli Ci przefiltrować listę rozwijaną przed wyświetleniem jej użytkownikowi.

var $t = $('#target'); 
 
$t.select2({ 
 
    multiple: true, 
 
    tags: true, 
 
    data: ["Pasty", "Pasta", "Posters"], 
 
    matcher: function(params, option) { 
 
    var selected = $t.select2('data'); 
 
    var optionSelected = selected.some(function(item) { 
 
     return (item.text === option.text); 
 
    }); 
 
    if (optionSelected) return false; 
 
    return option; 
 
    } 
 
});
#target { 
 
    width: 100%; 
 
}
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.min.js"></script> 
 
<link href="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/css/select2.min.css" rel="stylesheet" /> 
 
<select id="target"></select>

+0

czy wiesz, co różnica między niestandardowym dopasowaniem a zwracanym znakiem null w funkcji templateResult? – leora

+0

@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

+1

Dzięki za kontynuację – leora

0

Należy spojrzeć na zmiany funkcji templateResult ...

Funkcja templateResult powinien zwrócić ciąg zawierający tekst będzie lub obiekt (taki jak obiekt jQuery) zawierający dane, które powinny zostać wyświetlone. Może również zwrócić wartość null, co uniemożliwi wyświetlenie opcji na liście wyników.

https://select2.github.io/options.html#templateSelection

+1

dzięki James. Zaktualizowałem swoją odpowiedź za pomocą rozwiązania, które wydaje się działać. Daj mi znać, jeśli zauważysz jakieś problemy z moim rozwiązaniem lub masz inną sugestię. – leora

+0

Właściwie to właśnie uświadomiłem sobie powyższą odpowiedź, którą dodałem do twojego pytania. DOESN "T działa tak, jakbyś usunął tag, który wciąż pojawia się na liście, więc otrzymujesz problem polegający na tym, że jeśli usuniesz tag i chcesz go dodać z powrotem, nie pozwala ci to .. Więc wracam do deski kreślarskiej. Czy wiesz, jak mogę zapobiec? – leora

+0

Przepraszam, że nie :(Nigdy wcześniej tego nie używałem, ale czytając dokumentację wyglądało na to, że zadziała – JamesHalsall

-1

Można to osiągnąć po prostu jak poniżej,

Trzeba ukryć wybrane opcje korzystania CSS

$('select').select2();
.select2-container--default .select2-results__option[aria-selected=true] { 
 
    display: none; 
 
}
<link href="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/css/select2.min.css" rel="stylesheet" /> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.min.js"></script> 
 

 
<select id="Tags" name="Tags" multiple="multiple"> 
 
    <option value="1">first</option> 
 
    <option value="2">second</option> 
 
    <option value="3">third</option> 
 
    <option value="4">fourth</option> 
 
</select>

+2

To sztuczka, która działa, ale może powodować inne problemy, takie jak wybór klawiatury –

+0

@ MarcosPérezGude zgadzam się .. – jlocker

+0

Hej, nie martw się, ja zrobić to w projekcie i działa, ale w innych sytuacjach nie mogę napisać tej sztuczki.W zależności od potrzeb PO Powodzenia! –