“Função de consulta não definida para erro indefinido do Select2”


Respostas:


241

Coberto neste tópico do grupo do Google

O problema ocorreu devido à div extra que estava sendo adicionada pelo select2. O Select2 adicionou uma nova div com a classe "select2-container form-select" para agrupar o select criado. Então, da próxima vez que carreguei a função, o erro estava sendo gerado, pois select2 estava sendo anexado ao elemento div. Eu mudei meu seletor ...

Prefixe o identificador css select2 com o nome de tag específico "select":

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

De alguma forma, isso foi corrigido para mim. No meu caso, eu estava clonando uma linha de entradas de formulário que incluíam menus de seleção select2-ified e todo tipo de coisa estranha estava acontecendo após o primeiro clone.
martincarlin87

Também tem que estar dentro$(document).ready(function() { $('select.form-select').select2()})
TED

1
Como o mesmo problema pode ser resolvido na diretiva Angular UI Select2?
Zavidovych

Acabei de encontrar esse mesmo problema hoje - embora o mesmo código anteriormente não tenha problemas (talvez uma atualização do select2?). De qualquer forma, isso resolveu para mim também e funcionou bem novamente. Ótima resposta!
user756659

10
Esse problema geralmente ocorre se o controle de seleção já tiver sido inicializado pelo .select2({})método Uma solução melhor seria chamar o método de destruição primeiro. Ex:$("#mySelectControl").select2("destroy").select2({});
Dmitry S.

18

Esta mensagem de erro é muito geral. Uma de suas outras fontes possíveis é que você está tentando chamar o select2()método na entrada "select2ed" já.


13

Caso você inicialize uma entrada vazia, faça o seguinte:

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

Leia o primeiro comentário abaixo, explica por que e quando você deve usar o código na minha resposta.


2
Eu tive esse problema ao migrar uma caixa select2 de um elemento de seleção real para um tipo de entrada = elemento oculto que eu preenchia mais tarde. Ao percorrer o código select2, esse erro é gerado porque não é transmitido nenhum valor de consulta, ajax, dados ou tags. #
Daniel Daniel

1
Essa deve ser a resposta aceita para esta pergunta. Não sei por select2()que simplesmente não aceita parâmetros vazios
swdev 11/11


7

Para mim, esse problema se resumia em definir o atributo data-ui-select2 correto:

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


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

$scope.selectedProjectManager = {};

Se eu retirar a datapropriedade $scope.projectManagers, recebo esse erro.


5

Esse problema se resumia a como eu estava construindo minha caixa de seleção select2. Em um arquivo javascript eu tinha ...

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

E em outro arquivo js uma substituição ...

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

Mover a segunda substituição para um evento de carregamento de janela resolveu o problema.

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

Esse problema floresceu dentro de um aplicativo Rails


4

Eu também recebi o mesmo erro ao usar ajax com uma caixa de texto, então eu resolvo isso removendo a classe select2 da caixa de texto e a instalação select2 pela id como:

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

3

Parece que seu seletor retorna um elemento indefinido (portanto, undefined error é retornado)

Caso o elemento realmente exista, você está chamando select2 em um inputelemento sem fornecer nada para selecionar2, de onde deve buscar os dados. Normalmente, um chama .select2({data: [{id:"firstid", text:"firsttext"}]).


2

Também obteve o mesmo erro ao usar o ajax.

Se você estiver usando o ajax para renderizar formulários com o select2, a classe input_html deve ser diferente daquela NÃO processada usando o ajax. Não sei ao certo por que funciona dessa maneira.


Você quer dizer, "<input type = 'hidden' class = 'foo' ...." onde se você tiver vários select2, eles não podem ser todos 'foo'? Isso não funcionou para mim.
dethSwatch

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

Isso é acionado porque a consulta não existe nas opções. Internamente, é mantida uma verificação que requer um dos seguintes itens para os parâmetros

  • ajax
  • Tag
  • dados
  • inquerir

Então, você só precisa fornecer uma dessas 4 opções para selecionar2 e deve funcionar conforme o esperado.


0

Eu recebi o mesmo erro. Eu tenho usado select2-3.5.2

Este foi o meu código que teve erro

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

O código abaixo corrigiu o problema.

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

Eu usaria $ ('# carstatus-select'). Select2 ("val", [1,2]); como menção nos docs
hakuna1811

0

Eu tenho um aplicativo da Web complicado e não consegui descobrir exatamente por que esse erro estava sendo gerado. Isso estava causando o cancelamento do JavaScript quando lançado.

No select2.js eu mudei:

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

para:

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

Agora tudo parece funcionar corretamente, mas ainda está efetuando login no erro, caso eu queira tentar descobrir o que exatamente no meu código está causando o erro. Mas, por enquanto, isso é uma correção boa o suficiente para mim.


-2

usar :

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

}

isso ocultará apenas o erro, não o corrigirá. Esta não é uma solução na grande maioria dos casos
Ramses
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.