2017-09-22 2 views
0

Disons que j'ai cette boîte de sélection:erreur Select2 sur l'étiquette lorsque la valeur est pas la même que la valeur d'affichage

<select id="example" multiple="multiple" style="width: 300px"> 
    <option selected value="1">January</option> 
    <option value="2">February</option> 
    <option value="3">March</option> 
    <option value="4">April</option> 
    <option value="5">May</option> 
    <option value="6">June</option> 
    <option value="7">July</option> 
    <option value="8">August</option> 
    <option value="9">September</option> 
    <option value="10">October</option> 
    <option value="11">November</option> 
    <option value="12">December</option> 
</select> 

Pour communiquer avec beaucoup d'autres parties du site, la valeur ne peut être modifiée. Ceci est juste pour l'exemple de démonstration, le cas d'utilisation réel est quelque chose de plus compliqué et la valeur d'affichage doit être différente avec la valeur réelle du formulaire qui va être soumis.

Pour permettre la saisie semi-automatique et l'ajout d'une nouvelle étiquette, sélectionnez2 est utilisé.

$('#example').select2({ 
    placeholder: 'Select a month', 
    tags: true, 
    tokenSeparators: [',', ' '] 
}); 

JS fiddle for demo

Le problème est que lorsque vous tapez le nom complet du mois, comme « Janvier », puis appuyez sur l'espace, au lieu de sélectionner l'option existante « Janvier » (qui est ce que je m'y attendais), il crée juste une nouvelle étiquette avec la valeur January. Après quelques tests répétés, j'ai constaté que cela arrivait juste quand la valeur réelle n'est pas la même que la valeur d'affichage. Y a-t-il un moyen de garder les deux valeurs différentes mais de choisir l'option déjà existante?

+0

Je pense que vous avez besoin d'un type '' January' et January' vous ne souhaitez que 'January' d'être sélectionné. Ainsi vous pouvez filtrer le résultat qui est là en option et négliger les résultats indésirables. –

Répondre

1

Utiliser l'événement createTag en recherchant un match.

S'il n'y a pas de correspondance, et puisque vous ne voulez pas ajouter une nouvelle balise, retournez simplement null:

var options = $('#example option'); 

$('#example').select2({ 
    placeholder: 'Select a month', 
    tags: true, 
    tokenSeparators: [',', ' '], 
    createTag: function(params) {  
    var matchedVal = options.filter(function() { return $(this).html() === params.term; }).val();  
    return (matchedVal) ? { id: matchedVal, text: params.term } : null 
    } 
}); 

Démo: https://jsfiddle.net/2yu87gyf/

EDIT:

par votre commenter que vous voulez créer la balise si elle n'existe pas déjà - utilisez plutôt l'instruction return:

return (matchedVal) ? { id: matchedVal, text: params.term } : { id: params.term, text: params.term } 

Créer une balise inégalée démonstration: https://jsfiddle.net/2yu87gyf/1/

+0

Je veux créer une balise quand il n'y a pas de correspondance. Je ne veux juste pas ajouter une balise quand il y a une correspondance. Vous voulez éditer votre réponse? Je pense que vous êtes proche de la prime. (c'est-à-dire que devrais-je retourner si je veux ajouter une étiquette?) – cytsunny

+0

@cytsunny aucun problème, j'ai mis à jour ma réponse –

+0

Marqué comme réponse correcte. Pour attribuer une prime, stackoverflow a verrouillé la fonction. Vous devez attendre 9 heures de plus avant de déverrouiller. – cytsunny

0

Essayez cette

option Supprimer balises comme il va créer de nouvelles étiquettes à la volée

$('#example').select2({ 
    placeholder: 'Select a month', 
    tokenSeparators: [',', ' '] 
}); 
+0

@cytsunny accepter la réponse si cela a fonctionné pour vous.Merci – krishnar

+0

J'en ai besoin pour créer des étiquettes à la volée. Je ne veux tout simplement pas créer quand le tag existe déjà au début. – cytsunny

+0

Pire encore, même si je n'ai pas besoin de la fonction d'étiquette, presser le bouton d'espace ne peut toujours pas sélectionner l'option existante. – cytsunny