«Функция запроса не определена для неопределенной ошибки Select2»

121

Попытка использовать Select2 и получение этой ошибки при вводе нескольких элементов / текстовом поле:

"query function not defined for Select2 undefined error"
Дэниел Моррис
источник

Ответы:

241

Охвачено этой веткой группы Google

Проблема заключалась в дополнительном div, который добавлялся select2. Select2 добавил новый div с классом select2-container form-select, чтобы обернуть созданный выбор. Поэтому в следующий раз, когда я загрузил функцию, возникла ошибка, поскольку select2 был прикреплен к элементу div. Я сменил селектор ...

Префикс select2 css идентификатора с определенным именем тега "select":

$('select.form-select').select2();
Дэниел Моррис
источник
каким-то образом исправил это для меня, в моем случае я клонировал ряд входных данных формы, которые включали меню выбора с выбранным выбором, и после первого клона происходили всевозможные странные вещи.
martincarlin87
Также должно быть внутри$(document).ready(function() { $('select.form-select').select2()})
TED
1
Как можно решить ту же проблему в директиве Angular UI Select2?
zavidovych
Просто сегодня столкнулся с той же проблемой - хотя тот же код ранее не имел проблем (возможно, обновление select2?). В любом случае, это тоже решило эту проблему для меня и снова работало нормально. Отличный ответ!
user756659 03
10
Эта проблема обычно возникает, если элемент управления select уже был инициализирован .select2({})методом. Лучшим решением было бы сначала вызвать метод уничтожения. Пример:$("#mySelectControl").select2("destroy").select2({});
Дмитрий С.
18

Это сообщение об ошибке носит слишком общий характер. Одним из других возможных источников является то, что вы пытаетесь вызвать select2()метод для уже "select2ed" ввода.

Мартин Д.
источник
13

Если вы инициализируете пустой ввод, сделайте следующее:

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

Прочтите первый комментарий ниже, он объясняет, почему и когда вам следует использовать код в моем ответе.

kappaallday
источник
2
У меня возникла эта проблема, когда я перенес поле select2 из фактического элемента select в элемент input type = hidden, который я заполнял позже. При пошаговом выполнении кода select2 возникает эта ошибка, потому что не передается значение запроса, ajax, данных или тегов.
Даниэль,
1
Это должен быть принятый ответ на этот вопрос. Не уверен, почему select2()просто не примет пустые параметры
swdev
11

У меня также была эта проблема, убедитесь, что вы не инициализируете select2 дважды.

Педро Диас
источник
То же самое для меня, но для меня ошибка не была проблемой. s2 все равно работает
Reign.85
как это сделать?
Халед Салех 07
7

Для меня эта проблема сводилась к установке правильного атрибута 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 = {};

Если я сниму dataсобственность, $scope.projectManagersя получаю эту ошибку.

парламент
источник
5

Эта проблема сводилась к тому, как я создавал поле выбора select2. В одном файле javascript у меня было ...

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

А в другом js файле переопределение ...

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

Перемещение второго переопределения в событие загрузки окна разрешило проблему.

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

Эта проблема возникла внутри приложения Rails

keaplogik
источник
4

Я также получил ту же ошибку при использовании ajax с текстовым полем, затем я решил ее, удалив класс select2 текстового поля и настроив select2 по идентификатору, например:

$(function(){
  $("#input-select2").select2();
});
Хоанг Нгха
источник
3

Кажется, что ваш селектор возвращает неопределенный элемент (поэтому undefined errorвозвращается)

В случае, если элемент действительно существует, вы вызываете select2 для inputэлемента, не передавая ничего в select2, откуда он должен получать данные. Обычно один звонит .select2({data: [{id:"firstid", text:"firsttext"}]).

koppor
источник
2

Также возникла такая же ошибка при использовании ajax.

Если вы используете ajax для визуализации форм с помощью select2, класс input_html должен отличаться от тех, которые НЕ отображаются с использованием ajax. Не совсем уверен, почему это работает именно так.

mfamador
источник
Вы имеете в виду, например, "<input type = 'hidden' class = 'foo' ...." где, если у вас есть несколько select2, они не могут все быть 'foo'? У меня это не сработало.
dethSwatch
1
if (typeof(opts.query) !== "function") {
    throw "query function not defined for Select2 " + opts.element.attr("id");
}

Это вызвано тем, что запрос не существует в параметрах. Внутри ведется проверка, которая требует одного из следующих параметров для

  • Аякса
  • теги
  • данные
  • запрос

Итак, вам просто нужно предоставить один из этих 4 вариантов для select2, и он должен работать должным образом.

Сахил Джайн
источник
0

У меня такая же ошибка. Я использовал select2-3.5.2

Это был мой код с ошибкой

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

Код ниже исправил проблему.

    $('#carstatus-select').val([1,2]);
Джио Редди
источник
Я бы использовал $ ('# carstatus-select'). Select2 ("val", [1,2]); как упоминается в документации
hakuna1811
0

У меня сложное веб-приложение, и я не мог точно понять, почему возникла эта ошибка. Это приводило к прерыванию JavaScript при запуске.

В select2.js я изменил:

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

чтобы:

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

Теперь кажется, что все работает правильно, но он все еще регистрирует ошибку, если я хочу попытаться выяснить, что именно в моем коде вызывает ошибку. Но пока для меня это достаточно хорошее исправление.

Люк Венке
источник
-2

использование:

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

}
Махди Багери
источник
это только скроет ошибку, но не исправит ее. Это не решение в подавляющем большинстве случаев
Рамзес