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

4voto

Vikash Singh Points 6103

Améliorer la réponse de @fmpwizard :

//Allow manually entered text in drop down.
createSearchChoice:function(term, data) {
  if ( $(data).filter( function() {
    return term.localeCompare(this.text)===0; //even if the this.text is undefined it works
  }).length===0) {
    return {id:term, text:term};
  }
},

//solution to this error: Uncaught TypeError: Cannot read property 'localeCompare' of undefined

0 votes

J'ai utilisé cette méthode avec une légère modification. Je vais mettre ma réponse dans une seconde, mais merci.

3voto

Sam Points 847

Merci pour votre aide, j'ai utilisé le code ci-dessous dans Codeigniter. J'utilise la version 3.5.2 de select2.

var results = [];
var location_url = <?php echo json_encode(site_url('job/location')); ?>;
$('.location_select').select2({
    ajax: {
        url: location_url,
        dataType: 'json',
        quietMillis: 100,
        data: function (term) {
            return {
                term: term
            };
        },
        results: function (data) {
            results = [];
            $.each(data, function(index, item){
                results.push({
                    id: item.location_id,
                    text: item.location_name
                });
            });
            return {
                results: results
            };
        }
    },
    //Allow manually entered text in drop down.
    createSearchChoice:function(term, results) {
        if ($(results).filter( function() {
            return term.localeCompare(this.text)===0; 
        }).length===0) {
            return {id:term, text:term + ' [New]'};
        }
    },
});

0 votes

Je ne veux vraiment pas utiliser ajax, cela ne fera que causer des problèmes et m'obligera à faire plus de travail en ajoutant une option de suppression. POURQUOI EST-CE SI DIFFICILE ? Tout ce qu'ils ont à faire, c'est d'ajouter un "NE PAS EFFACER LE CHAMP TEXTE SI AUCUNE VALEUR N'EST TROUVÉE".

0 votes

Quels types de problèmes ? J'utilise Ajax depuis plus de 10 ans maintenant, et je n'ai jamais eu l'impression qu'il me causait le même niveau d'alarme ou d'inquiétude qu'il vous cause, peut-être pourriez-vous nous en dire plus ?

0 votes

Oui, bien sûr, le problème auquel je vais être confronté est le fait que, disons par exemple que l'utilisateur entre une valeur erronée, cette valeur a déjà été envoyée au serveur pour être ajoutée à la base de données. Il faut maintenant gaspiller un appel de repos et ajouter 15 minutes de travail supplémentaire juste pour tenir compte de cela (en envoyant un autre appel de repos au serveur pour lui dire de supprimer cette valeur). J'ai fini par utiliser des balises, ce que je ne voulais pas faire parce que ce n'est pas 100% exact avec les dessins que j'ai donnés au client.

3voto

Derek Points 78

Je viens de tomber sur ceci de Kevin Brown. https://stackoverflow.com/a/30019966/112680

Tout ce que vous avez à faire pour v4.0.6 est utilisé tags: true paramètre.

0 votes

Que faire si vous souhaitez conserver le format de la zone de texte ?

0 votes

Désolé, je ne connais pas la réponse. Cela fait bien trop longtemps et je ne l'utilise pas actuellement.

1voto

Paul Points 11
var text = 'New York Mills';
var term = 'new york mills';
return text.localeCompare(term)===0;

Dans la plupart des cas, nous avons besoin de comparer des valeurs avec un registre insensible. Et ce code retournera false, ce qui conduira à la création d'enregistrements dupliqués dans la base de données. De plus, String.prototype.localeCompare () n'est pas supporté par le navigateur Safary et ce code ne fonctionnera pas dans ce navigateur ;

return this.text.localeCompare(term)===0;

remplacera mieux à

return this.text.toLowerCase() === term.toLowerCase();

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