Ajouter dynamiquement l'article au contrôle jQuery Select2 qui utilise AJAX

j'ai un contrôle jQuery Select2 qui utilise AJAX pour peupler:

<input type="text" name="select2" id="select2" style='width:400px' value="999">

var initialSelection = { id: '999', text:"Some initial option"};

$("#select2").select2({
    placeholder: "Select Option",
    minimumInputLength: 2,
    ajax: { 
        url: "/servletToGetMyData",
        dataType: 'json',
        data: function (term, page) { return { term: term }; },
        results: function (data, page) {  return { results: data.results} }
    },
    initSelection : function(element, callback){ callback(initialSelection); },     
    escapeMarkup: function (m) { return m; }
}); 

les liens AJAX à une base de données d'options possibles et comme vous pouvez le voir nécessite deux caractères d'entrée.

le problème est que l'utilisateur peut utiliser un dialogue pour ajouter une nouvelle option si l'option n'existe pas dans la base de données. Au retour de ce dialogue, j'essaie:

var o = $("<option/>", {value: newID, text: newText});
$('#select2').append(o);
$('#select2 option[value="' + newID + '"]').prop('selected',true);
$('#select2').trigger('change');

mais ça ne marche pas. Le même code exact fonctionne pour non-AJAX Sélectionnez 2 boîtes. J'ai essayé plusieurs alternatives, comme utiliser $('#select2').select2("val", newID); mais ça ne marche pas.

j'ai même essayé de supprimer complètement le contrôle Select2. Cependant, $('#select2').remove() ne supprime que le champ original mais laisse le contrôle Select2 s'éterniser. Notez que la page a plus d'un contrôle Select2, donc je ne peux pas utiliser un sélecteur de classe pour les contrôles Select2 car il va supprimer d'autres contrôles dont j'ai besoin.

N'importe quelle idée) ajouter dynamiquement une option à une commande Select2 qui utilise AJAX; ou B) supprimer complètement une commande Select2 pour qu'elle puisse être ajoutée de nouveau? Ou toute autre solution...

Modifier J'ai trouvé une autre question qui montre comment supprimer un élément select2, en utilisant .select2("détruire"). Cela fonctionne, mais est, à mon avis, sous-optimale. Je préférerais de loin pouvoir ajouter l'option plutôt que de détruire et recréer le select2.

42
demandé sur Nakilon 2014-08-21 18:01:17

8 réponses

C'est beaucoup plus facile à faire à partir de select2 v4. Vous pouvez créer un new Option , et l'ajouter directement à l'élément select . Voir mon codepen ou l'exemple ci-dessous:

$(document).ready(function() {
    $("#state").select2({
      tags: true
    });
      
    $("#btn-add-state").on("click", function(){
      var newStateVal = $("#new-state").val();
      // Set the value, creating a new option if necessary
      if ($("#state").find("option[value=" + newStateVal + "]").length) {
        $("#state").val(newStateVal).trigger("change");
      } else { 
        // Create the DOM option that is pre-selected by default
        var newState = new Option(newStateVal, newStateVal, true, true);
        // Append it to the select
        $("#state").append(newState).trigger('change');
      } 
    });  
});
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"/>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.1/css/select2.min.css" rel="stylesheet"/>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.1/js/select2.min.js"></script>


<select id="state" class="js-example-basic-single" type="text" style="width:90%">
  <option value="AL">Alabama</option>
  <option value="WY">Wyoming</option>
</select>
<br>
<br>
<input id="new-state" type="text" />
<button type="button" id="btn-add-state">Set state value</button>

conseil: essayez d'entrer des valeurs existantes dans la zone de texte, comme" AL "ou"WY". Ensuite, essayez d'ajouter quelques nouvelles valeurs.

33
répondu alexw 2016-02-13 22:20:17

il s'agissait d'une solution simple: régler les données dans la sélection 2 Après avoir inséré avec AJAX

$("#select2").select2('data', {id: newID, text: newText});      
27
répondu Bumptious Q Bangwhistle 2017-05-23 12:10:40

dans le cas de Select2 Version 4+

il a changé la syntaxe et vous devez écrire comme ceci:

// clear all option
$('#select_with_blank_data').html('').select2({data: [{id: '', text: ''}]});

// clear and add new option
$("#select_with_data").html('').select2({data: [
 {id: '', text: ''},
 {id: '1', text: 'Facebook'},
 {id: '2', text: 'Youtube'},
 {id: '3', text: 'Instagram'},
 {id: '4', text: 'Pinterest'}]});
15
répondu Sruit A.Suk 2016-09-25 09:24:32

Dans La Sélection2 4.0.2

$("#yourId").append("<option value='"+item+"' selected>"+item+"</option>");
$('#yourId').trigger('change'); 
13
répondu Digvijay 2016-06-28 19:25:52

j'ai résolu le problème à l'aide de ce lien http://www.bootply.com/122726 . avec un peu de chance, vous aidera

ajoute l'option dans select2 jquery et lie votre appel ajax avec le lien créé id(#addNew) pour la nouvelle option de backend. et le code

 $.getScript('http://ivaynberg.github.io/select2/select2-3.4.5/select2.js',function(){

  $("#mySel").select2({
    width:'240px',
    allowClear:true,
    formatNoMatches: function(term) {
        /* customize the no matches output */
        return "<input class='form-control' id='newTerm' value='"+term+"'><a href='#' id='addNew' class='btn btn-default'>Create</a>"
    }
  })
  .parent().find('.select2-with-searchbox').on('click','#addNew',function(){
    /* add the new term */
    var newTerm = $('#newTerm').val();
    //alert('adding:'+newTerm);
    $('<option>'+newTerm+'</option>').appendTo('#mySel');
    $('#mySel').select2('val',newTerm); // select the new term
    $("#mySel").select2('close');       // close the dropdown
  })

});



<div class="container">
    <h3>Select2 - Add new term when no search matches</h3>
    <select id="mySel">
        <option>One</option>
        <option>Two</option>
        <option>Three</option>
        <option>Four</option>
        <option>Five</option>
        <option>Six</option>
        <option>Twenty Four</option>
    </select>
    <br>
    <br>
</div>
9
répondu Suneel 2014-12-04 08:59:17

s'Étendant sur Bumptious Q Bangwhistle réponse:

$('#select2').append($('<option>', { 
    value: item,
    text : item 
})).select2();

cela ajouterait les nouvelles options dans les tags <select> et permet à select2 de le rendre de nouveau.

5
répondu hareluya86 2016-06-25 11:15:07
$("#my_select").select2('destroy').empty().select2({data: [{id: 1, text: "new_item"}]});
1
répondu Musznik 2016-07-14 13:48:21

Je l'ai fait de cette façon et cela a fonctionné pour moi comme un charme.

var data = [{ id: 0, text: 'enhancement' }, { id: 1, text: 'bug' }, { id: 2, 

    text: 'duplicate' }, { id: 3, text: 'invalid' }, { id: 4, text: 'wontfix' }];

    $(".js-example-data-array").select2({
      data: data
    })
1
répondu Chaudhry Waqas 2017-04-09 13:19:38