2012-11-07 17 views
50

Mam dwa zaznaczenia, które są połączone: Każda wartość pierwszego wyboru określa, które elementy będą wyświetlane w drugim wyborze.select2 zmiana pozycji dynamicznie

Wartości drugie wybrania są przechowywane w tablicy dwa wymiary:

[ [{"id":1,"text":"a"}, {"id":2,"text":"b"},...], 
    [{"id":"1a","text":"aa"},{"id":"1b","text":"ba"},...], 
    ... 
] 

Pierwszy dobrać wartość określa indeks jest stosowany do wypełnienia drugiej wybierz. Tak więc w przypadku "zmiany" na pierwszym, powinienem móc modyfikować elementy select-two zawiera.

Czytanie dokumentacji Myślę, że potrzebuję skorzystać z opcji "danych" ... ale nie wyjaśnię, jak przykład ładuje dane tablicy podczas inicjalizacji i wygląda na to, że nie działa, jeśli spróbuję zrobić to samo po inicjalizacji .

HTML

Attribute: 
<select name="attribute" id="attribute"> 
    <option value="0">Color</option> 
    <option value="1">Size</option> 
</select> 

Value: 
<select name="value" id="value"></select> 

<script> 
    var data = [ [{"id":1,"text":"black"}, {"id":2,"text":"blue"},...], 
       [{"id":"1","text":"9"},{"id":"1","text":"10"},...], 
       ]; 
    $('#attribute').select2().bind('change', function(){ 
     // Here I need to change `#value` items. 
     $('#value').select2('data',data[$(this).val()]); // This does not work 
    ); 

    $('#value').select2(); 
</script> 
+3

Pokaż nam kod już masz. – Aesthete

+0

Przykład dodany, W komentarzu próbowałem $ ("wartość #"). Select2 ("dane", dane [$ (this) .val()]); –

+0

https://stackoverflow.com/questions/16480910/update-select2-data-without-rebuild-the-control – ndpu

Odpowiedz

56

zrobiłem dla was przykładem pokazując, jak można to zrobić.

Wskazówka js ale również, że zmienił #ARG do elementu wejściowego

<input id="value" type="hidden" style="width:300px"/> 

i że jestem wyzwalania zdarzenie change uzyskania wartości początkowe

$('#attribute').select2().on('change', function() { 
    $('#value').select2({data:data[$(this).val()]}); 
}).trigger('change'); 

Code Example

Edytuj:

W bieżącej wersji select2 atrybut klasy jest przenoszony z ukrytego wejścia do elementu głównego utworzonego przez select2, nawet klasa select2-offscreen, która pozycjonuje element poza granicami strony.

Aby rozwiązać ten problem, wystarczy dodać removeClass('select2-offscreen') przed ponownym zastosowaniem opcji select2 na tym samym elemencie.

$('#attribute').select2().on('change', function() { 
    $('#value').removeClass('select2-offscreen').select2({data:data[$(this).val()]}); 
}).trigger('change'); 

Dodałem nową Code Example aby rozwiązać ten problem.

+1

Wystarczy zaktualizować jsfiddle do bieżącego select2, a źródła jquery je zepsują. (http://jsfiddle.net/pFY9Z/) Czy masz przykład, który działałby z aktualnymi wersjami? – gomad

+4

Zaktualizowałem moją odpowiedź i dodałem nowy przykład kodu – iMoses

+0

Rewelacyjny - znowu działa! Dziękuję bardzo. – gomad

1

naprawić brak biblioteki przykład tu:

<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/3.5.2/select2.css" rel="stylesheet"/> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/3.5.2/select2.js"> 

http://jsfiddle.net/bbAU9/328/

8

Spróbuj użyć właściwość wyzwalania dla tego:

$('select').select2().trigger('change'); 
+11

Proszę wyjaśnić, co to robi i dlaczego odpowiada na pytanie. –

+0

najpierw przypisz nową wartość do 'select', a następnie' trigger' zmień jak '$ ('select'). Select2(). Trigger ('change'); $ ('select'). Select2(). Trigger ('change'); ' – aje

2

w moim projekcie używam następujący kod:

$('#attribute').select2(); 
$('#attribute').bind('change', function(){ 
    var $options = $(); 
    for (var i in data) { 
     $options = $options.add(
      $('<option>').attr('value', data[i].id).html(data[i].text) 
     ); 
    } 
    $('#value').html($options).trigger('change'); 
}); 

Spróbuj wykomentuj część select2. Reszta kodu nadal będzie działać.

+0

Dzięki, działa również idealnie dla mnie. –

14

ja z powodzeniem przy użyciu następujących opcji dynamicznie aktualizować:

$control.select2('destroy').empty().select2({data: [{id: 1, text: 'new text'}]});

+0

empty() zrobił lewę :)! –

Powiązane problemy