137 votes

Select2 dropdown mais autoriser de nouvelles valeurs par l'utilisateur ?

Je veux avoir une liste déroulante avec un ensemble de valeurs, mais aussi permettre à l'utilisateur de "sélectionner" une nouvelle valeur qui ne figure pas dans la liste.

Je vois que sélectionner2 supporte ceci si vous l'utilisez dans tags mais existe-t-il un moyen de le faire sans utiliser de balises ?

1 votes

Select2 n'a jamais fonctionné pour moi, du moins createSearchChoice n'a jamais fonctionné pour moi dans la version 4.0.3, et je ne voulais pas que mes utilisateurs attendent la fin de l'ajax pour retourner le même mot-clé, donc j'ai dû déployer ma propre bibliothèque, je la partage seulement parce que je pense qu'elle pourrait aider d'autres personnes qui sont encore confuses comme je l'étais, s'il vous plaît ne votez pas si vous n'êtes pas d'accord avec ma réponse : github.com/razzbee/tagcomplete

213voto

Kevin Brown Points 27724

El excellente réponse fourni par @fmpwizard fonctionne pour Select2 3.5.2 et inférieur, mais il ne fonctionnera pas en 4.0.0 .

Depuis très longtemps (mais peut-être pas aussi tôt que cette question), Select2 supporte le "tagging" : les utilisateurs peuvent ajouter leur propre valeur si vous les y autorisez. Ceci peut être activé par le biais de l'option tags et vous pouvez jouer avec l'option un exemple dans la documentation .

$("select").select2({
  tags: true
});

Par défaut, cela crée une option dont le texte est identique à celui du terme de recherche qu'ils ont saisi. Vous pouvez modifier l'objet utilisé si vous cherchez à le marquer d'une manière particulière, ou créer l'objet à distance une fois qu'il est sélectionné.

$("select").select2({
  tags: true,
  createTag: function (params) {
    return {
      id: params.term,
      text: params.term,
      newOption: true
    }
  }
});

En plus de servir de drapeau facile à repérer sur l'objet passé par le biais de la select2:select la propriété supplémentaire vous permet également de rendre l'option légèrement différente dans le résultat. Ainsi, si vous souhaitez signaler visuellement le fait qu'il s'agit d'une nouvelle option en mettant " (nouveau) "à côté, vous pourriez faire quelque chose comme ça.

$("select").select2({
  tags: true,
  createTag: function (params) {
    return {
      id: params.term,
      text: params.term,
      newOption: true
    }
  },
  templateResult: function (data) {
    var $result = $("<span></span>");

    $result.text(data.text);

    if (data.newOption) {
      $result.append(" <em>(new)</em>");
    }

    return $result;
  }
});

0 votes

C'est très utile @Markus1980Wien

0 votes

Je crois que j'ai utilisé cet extrait à plusieurs reprises.

0 votes

Si cela ne fonctionne pas, vérifiez que vous avez bien ajouté cette option dans le select2 et non dans les options ajax. pour select2 ajax

106voto

fmpwizard Points 1673

Pour la version 4+, vérifiez cette réponse ci-dessous par Kevin Brown

Dans Select2 3.5.2 et inférieur, vous pouvez utiliser quelque chose comme :

$(selector).select2({
  minimumInputLength:1,
  "ajax": {
    data:function (term, page) {
      return { term:term, page:page };
    },
    dataType:"json",
    quietMillis:100,
    results: function (data, page) {
      return {results: data.results};
    },
    "url": url
  },
  id: function(object) {
    return object.text;
  },
  //Allow manually entered text in drop down.
  createSearchChoice:function(term, data) {
    if ( $(data).filter( function() {
      return this.text.localeCompare(term)===0;
    }).length===0) {
      return {id:term, text:term};
    }
  },
});

(extrait d'une réponse sur la liste de diffusion select2, mais je ne trouve pas le lien maintenant)

4 votes

Désolé pour la réponse tardive mais merci beaucoup pour votre solution ! L'autre personne a posté un lien vers votre liste, ce qui vous rend doublement génial :)

0 votes

Rrauenza awesome, exactement ce que je cherchais

0 votes

+1 génial, juste un commentaire, le nouvel élément est ajouté à la liste seulement si je clique sur entrer ! Est-il possible que la nouvelle valeur soit acceptée lorsque la boîte de sélection perd le focus (juste une boîte de saisie normale !) ?

14voto

Michel Ayres Points 1389

Juste pour le plaisir de garder le code vivant, j'affiche Code du violon @rrauenza de son commentaire .

HTML

<input type='hidden' id='tags' style='width:300px'/>

jQuery

$("#tags").select2({
    createSearchChoice:function(term, data) { 
        if ($(data).filter(function() { 
            return this.text.localeCompare(term)===0; 
        }).length===0) 
        {return {id:term, text:term};} 
    },
    multiple: false,
    data: [{id: 0, text: 'story'},{id: 1, text: 'bug'},{id: 2, text: 'task'}]
});

2 votes

Je suis allé voir le violon, mais il ne semble pas fonctionner pour moi dans Chrome. Pouvez-vous confirmer ?

0 votes

@IcedDante le code fonctionne. le point dans le fiddle est juste pour montrer comment il devrait être fait (le select est caché dans le fiddle)

4 votes

Lorsque je me rends dans le violon, je ne vois nulle part une liste déroulante select2. Ne serait-il pas agréable d'avoir un exemple qui fasse réellement... quelque chose ?

12voto

Eric Points 828

Comme beaucoup de ces réponses ne fonctionnent pas en 4.0+, si vous utilisez ajax, vous pouvez faire en sorte que le serveur ajoute la nouvelle valeur comme une option. Cela fonctionnerait donc comme suit :

  1. L'utilisateur recherche une valeur (ce qui entraîne une demande ajax au serveur).
  2. Si la valeur trouvée est bonne, renvoyer l'option. Sinon, il suffit que le serveur ajoute cette option comme ceci : [{"text":" my NEW option)","id":"0"}]
  3. Lorsque le formulaire est soumis, il suffit de vérifier si cette option est présente dans la base de données et, si ce n'est pas le cas, de la créer avant de l'enregistrer.

12voto

Steven Moffat Points 281

Il y a une meilleure solution je pense maintenant

il suffit de mettre le balisage à true dans les options de sélection ?

tags: true

de https://select2.org/tagging

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X