„Funkcja zapytania nie została zdefiniowana dla niezdefiniowanego błędu Select2”


Odpowiedzi:


241

Omówione w tym wątku grupy Google

Problem wynikał z dodatkowego elementu div, który był dodawany przez select2. Select2 dodał nowy element div z klasą „select2-container form-select”, aby opakować utworzony element zaznaczenia. Więc następnym razem, gdy ładowałem funkcję, zgłaszany był błąd, ponieważ select2 był dołączany do elementu div. Zmieniłem selektor ...

Przedrostek identyfikatora css select2 z określoną nazwą tagu „select”:

$('select.form-select').select2();

jakoś to naprawiłem, w moim przypadku klonowałem wiersz danych wejściowych formularza, który zawierał menu wyboru select2-ified i różne dziwne rzeczy działo się po pierwszym klonie.
martincarlin87

Musi też być w środku$(document).ready(function() { $('select.form-select').select2()})
TED

1
Jak można rozwiązać ten sam problem w dyrektywie Angular UI Select2?
zavidovych

Właśnie dzisiaj natknąłem się na ten sam problem - chociaż ten sam kod wcześniej nie miał żadnych problemów (być może aktualizacja select2?). W każdym razie to rozwiązało to również dla mnie i znów działało dobrze. Świetna odpowiedź!
user756659

10
Ten problem zwykle występuje, jeśli kontrolka wyboru została już zainicjowana przez .select2({})metodę. Lepszym rozwiązaniem byłoby najpierw wywołanie metody zniszczenia. Np .:$("#mySelectControl").select2("destroy").select2({});
Dmitry S.

18

Ten komunikat o błędzie jest zbyt ogólny. Jednym z innych możliwych źródeł jest to, że próbujesz wywołać select2()metodę na już „select2ed” wejściu.


13

Jeśli zainicjujesz puste wejście, wykonaj następujące czynności:

$(".yourelement").select2({
 data: {
  id: "",
  text: ""
 }
});

Przeczytaj pierwszy komentarz poniżej, który wyjaśnia, dlaczego i kiedy powinieneś użyć kodu w mojej odpowiedzi.


2
Miałem ten problem, kiedy migrowałem pole select2 z rzeczywistego elementu select do elementu wejściowego type = hidden, który wypełniałem później. Podczas przechodzenia przez kod select2 ten błąd jest generowany, ponieważ nie ma przekazanej wartości zapytania, ajax, danych lub tagów.
Daniel

1
To powinna być akceptowana odpowiedź na to pytanie. Nie jestem pewien, dlaczego select2()po prostu nie zaakceptuje pustych parametrów
swdev

11

Miałem też ten problem, upewnij się, że nie inicjalizujesz dwukrotnie select2.


dla mnie to samo, ale błąd nie był dla mnie problemem. s2 i tak działa
Reign.85

jak to zrobić?
khaled saleh

7

U mnie ten problem sprowadzał się do ustawienia prawidłowego atrybutu data-ui-select2:

<input type="text" data-ui-select2="select2Options.projectManagers" placeholder="Project Manager" ng-model="selectedProjectManager">


$scope.projectManagers = { 
  data: []  //Must have data property 
}

$scope.selectedProjectManager = {};

Jeśli zdejmę datanieruchomość na $scope.projectManagers, otrzymuję ten błąd.


5

Ten problem sprowadzał się do tego, jak budowałem moje pole wyboru select2. W jednym pliku javascript miałem ...

$(function(){
  $(".select2").select2();
});

A w innym pliku js przesłonięcie ...

$(function(){
    var employerStateSelector = 
                $("#registration_employer_state").select2("destroy");
    employerStateSelector.select2({
    placeholder: 'Select a State...'
    });
});

Przeniesienie drugiej zmiany do zdarzenia ładowania okna rozwiązało problem.

$( window ).load(function() {
  var employerStateSelector = 
              $("#registration_employer_state").select2("destroy");
  employerStateSelector.select2({
    placeholder: 'Select a State...'
  });
});

Ten problem pojawił się w aplikacji Railsowej


4

Otrzymałem również ten sam błąd podczas używania Ajax z polem tekstowym, a następnie rozwiązuję go, usuwając klasę select2 z pola tekstowego i ustawiając select2 według identyfikatora:

$(function(){
  $("#input-select2").select2();
});

3

Wygląda na to, że twój selektor zwraca niezdefiniowany element (Dlatego undefined error jest zwracany)

W przypadku, gdy element naprawdę istnieje, wywołujesz select2 na inputelemencie bez dostarczania czegokolwiek do select2, skąd powinien pobierać dane. Zazwyczaj dzwoni się .select2({data: [{id:"firstid", text:"firsttext"}]).


2

Występuje również ten sam błąd podczas korzystania z ajax.

Jeśli używasz Ajax do renderowania formularzy za pomocą select2, klasa input_html musi być inna niż te, które NIE są renderowane przy użyciu Ajax. Nie do końca jestem pewien, dlaczego to działa w ten sposób.


Masz na myśli na przykład „<input type = 'hidden' class = 'foo' ....”, gdzie jeśli masz wiele select2, nie mogą one wszystkie być „foo”? To nie zadziałało dla mnie.
dethSwatch

1
if (typeof(opts.query) !== "function") {
    throw "query function not defined for Select2 " + opts.element.attr("id");
}

Jest to generowane, ponieważ zapytanie nie istnieje w opcjach. Wewnętrznie prowadzona jest kontrola, która wymaga jednego z poniższych parametrów

  • Ajax
  • tagi
  • dane
  • pytanie

Musisz więc tylko podać jedną z tych 4 opcji do select2 i powinna działać zgodnie z oczekiwaniami.


0

Mam ten sam błąd. Używam select2-3.5.2

To był mój kod, który zawierał błąd

    $('#carstatus-select').select2().val([1,2])

Poniższy kod naprawił problem.

    $('#carstatus-select').val([1,2]);

Użyłbym $ ('# carstatus-select'). Select2 ("val", [1,2]); jak wspomniano w dokumentacji
hakuna1811

0

Mam skomplikowaną aplikację internetową i nie mogłem dokładnie zrozumieć, dlaczego ten błąd jest generowany. Po rzuceniu JavaScript przerywał działanie.

W select2.js zmieniłem:

        if (typeof(opts.query) !== "function") {
            throw "query function not defined for Select2 " + opts.element.attr("id");
        }

do:

        if (typeof(opts.query) !== "function") {
            console.error("query function not defined for Select2 " + opts.element.attr("id"));
        }

Teraz wszystko wydaje się działać poprawnie, ale nadal loguje się błąd, na wypadek, gdybym chciał spróbować dowiedzieć się, co dokładnie w moim kodzie powoduje błąd. Ale na razie jest to dla mnie wystarczająco dobre rozwiązanie.


-2

posługiwać się :

try {
    $("#input-select2").select2();
}
catch(err) {

}

to tylko ukryje błąd, a nie naprawi go. To nie jest rozwiązanie w zdecydowanej większości przypadków
Ramzes
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.