Définir par programmation de la valeur d'un Select2 ajax
J'ai un Select2 de l'auto-complétion d'entrée (construits par l'intermédiaire de SonataAdmin), mais pas pour la vie de me comprendre comment le définir par programmation, il à une paire clé/valeur.
Il y a un JS Fiddle ici qui montre à peu près ce que j'ai. Ce que je veux savoir est ce que la fonction que je peux attacher le bouton de sorte que
- la Select2 champ affiche le texte "NOUVELLE VALEUR" pour l'utilisateur, et
- la Select2 champ de soumettre une valeur de "1" lorsque le formulaire est envoyé au serveur
J'ai essayé toutes sortes de combinaisons de jQuery et Select2 data
et val
méthodes, appelé à l'encontre de diverses entrées sur la page, mais rien ne semble fonctionner... sûrement il y a une certaine façon de le faire?
-- Edit --
La accepté de répondre ci-dessous est très utile, permet de jeter un peu de lumière sur la bonne façon d'initialiser la sélection et explique ce que initSelection est pour.
Cela dit, il semble que ma plus grosse erreur ici, c'est la façon dont j'ai été d'essayer de déclencher le changement.
J'ai été en utilisant:
$(element).select2('data', newObject).trigger('change');
Mais il en résulte un vide add
objet à l'intérieur de select2 de l'événement de changement.
Si, au lieu de cela, vous utilisez:
$(element).select2('data', newObject, true);
le code fonctionne comme il se doit, avec la newObject
disponible dans select2 de l'événement de changement et les valeurs définies correctement.
J'espère que cette information supplémentaire aide à quelqu'un d'autre!
Vous devez vous connecter pour publier un commentaire.
Remarque: La Question et cette Réponse sont pour Select2 v3. Select2 v4 est très différent de l'API que la v3.
Je pense que le problème est le
initSelection
fonction. Êtes-vous à l'aide de cette fonction pour définir la valeur initiale? Je sais que le Select2 documentation donne l'impression que c'est le but, mais il dit aussi "c'est un id->objet en fonction de mappage," et qui n'est pas la façon dont vous l'avez mise en place.Pour une raison que l'appel à
.trigger('change')
causes de lainitSelection
la fonction appelée, ce qui change la valeur sélectionnée pour en revenir à "ENABLED_FROM_JS".Essayer de se débarrasser de la
initSelection
fonction et, à la place de la valeur initiale à l'aide de:jsfiddle
Remarque: L'OP a fourni les
formatResult
etformatSelection
options. En tant que tels, ces fonctions de rappel attendre les éléments à avoir un "label" de la propriété, plutôt que d'un "texte" de la propriété. Pour la plupart des utilisateurs, il convient de:Plus d'infos sur le
initSelection
fonction:Si vous rechercher à travers le Select2 documentation pour "initSelection", vous verrez qu'il est utilisé lorsque l'élément a une valeur initiale et lorsque l'élément de
.val()
fonction est appelée. C'est parce que ces valeurs se composent seulement d'unid
et Select2 besoins de l'ensemble de l'objet de données (en partie il possible d'afficher l'étiquette correcte).Si le Select2 de contrôle a été l'affichage d'une liste statique, la
initSelection
fonction serait facile d'écrire (et il semble que Select2 pourrait fournir de l'énergie pour vous). Dans ce cas, leinitSelection
fonction aurait juste à regarder laid
dans la liste de données et de retourner les données correspondantes de l'objet. (Je dis "retour" ici, mais il n'a pas vraiment de retour à l'objet de données; il passe à une fonction de rappel.)Dans votre cas, vous n'avez probablement pas besoin de fournir le
initSelection
fonction depuis votre élément n'a pas de valeur initiale (en html) et que vous ne vont pas à l'appel de son.val()
méthode. Il suffit de garder à l'aide de la.select2('data', ...)
méthode pour définir les valeurs par programmation.Si vous étiez à fournir la
initSelection
fonction pour une saisie semi-automatique (qui utilise ajax), il serait probablement besoin de faire un appel ajax pour construire l'objet de données.initSelection
est Déconseillée dans Select2 4.0. Ceci a été remplacé par lecurrent
sur le adaptateur de données, et n'est disponible dans les builds complet.Note ce a été testé avec la version 4+
J'ai enfin réussi à faire des progrès après avoir découvert cette discussion: https://groups.google.com/forum/#!topic/select2/TOh3T0yqYr4
Le dernier commentaire de notes d'une méthode que j'ai été en mesure d'utiliser avec succès.
Exemple:
Cela semble être assez d'informations pour qu'il corresponde à l'ajax de données et la valeur correctement. Cela a aidé énormément avec des Données Personnalisées Cartes.
new Option
mais cela ne fonctionne pas pour les appels AJAX avec la création de modèles personnalisésPour définir les valeurs initiales que vous devez ajouter les options nécessaires balise pour le sélectionner l'élément avec jQuery, puis de définir ces options sélectionnées avec select2 du val méthode et enfin déclencher select2 du "changement" de l'événement.
Le troisième argument booléen indique select2 pour déclencher le changement de l'événement.
Pour plus d'info, voir https://github.com/select2/select2/issues/3057
Attention, il y a une erreur dans "validé" commentaire.
La manière correcte est
Utilisation
text
au lieu delabel
formatResult
etformatSelection
options. La manière dont ces fonctions sont écrites, ils s'attendent à des éléments à avoir un "label" de la propriété, et non pas d'un "texte" de la propriété. J'ai ajouté à ma réponse pour que cela soit clair pour les autres.de leurs exemples
https://select2.github.io/examples.html
Accès au programme:
Si vous supprimez le
.trigger('change')
de votre bricoler journauxObject {id: 1, label: "NEW VALUE"}
(besoin de cliquer deux fois depuis la journalisation est avant le changement de valeur). Est-ce que vous cherchez?.trigger('change');
, trop, et il a travaillé pour moi (Chrome)Lors de l'utilisation de select2 avec plusieurs option, utilisez cette construction:
jqueryselect2plusieurssetconcaténation
ce que c'est:
Tout ce que vous avez à faire est de définir la valeur, et puis l'exécuter:
$ ('#myselect').select2 ();
ou$ ('select').select2 ();
.Et tout est mis à jour très bien.
Avec Select2 version 4+, il n'y a effectivement rien de spécial que vous devez faire. Standard de jQuery avec un "changement" de l'événement déclencheur, à la fin des travaux.
Il y a un exemple de base de la Select2 de la documentation:
https://select2.org/programmatic-control/add-select-clear-items
POUR LA VERSION 3.5.3
Basé sur John S' répondre . Juste le le ci-dessus ne fonctionne cependant que si lors de l'initialisation du select2 la
initSelection
option n'est pas initialisé.Pour ceux qui sont encore à l'aide de la version 3.5 ou encore plus élevées. S'il vous plaît être sûr de savoir comment vous référence select2.js pour votre page. Si vous utilisez async ou de report de charge. Ce plug-in peut se comporter différemment.
Pensé à le mentionner.
Dans ma situation, j'ai été en mesure de rendre le présélectionnés option dans le code HTML côté serveur avec PHP.
Lors de mon chargement de la page, je connaissais déjà la valeur de l'option, donc mon
<select name="team_search"></select>
est devenu le suivant;Comme vous pouvez le voir, quand j'ai un
$preselected_team
de rendre disponible en option avec leselected
attribut,value
et ensemble d'étiquettes. Et, si je n'ai pas de valeur alors pas l'option est rendu.Cette approche n'est pas toujours possible (et dans le cas de l'OP n'est pas mentionné), mais il ne viennent avec l'avantage supplémentaire d'être prêt au chargement de la page à l'avance de l'exécution de JavaScript.