¿Cómo cambio el valor seleccionado del menú desplegable select2 con JqGrid?

178

Estoy usando la demostración select2 de Oleg , pero me pregunto si sería posible cambiar el valor actualmente seleccionado en el menú desplegable.

Por ejemplo, si los cuatro valores cargados fueran: "Any", "Fruit", "Vegetable", "Meat"y la lista desplegable predeterminada "Any", ¿cómo podría cambiar eso "Fruit"en el evento JqGrid loadComplete?

es posible?

Adam K Dean
fuente

Respuestas:

407

Para la versión select2> = 4.0.0

Es posible que las otras soluciones no funcionen, sin embargo, los siguientes ejemplos deberían funcionar.

Solución 1: hace que se activen todos los eventos de cambio adjuntos, incluido select2

$('select').val('1').trigger('change');

Solución 2: hace que el evento de cambio SOLO select2 se active

$('select').val('1').trigger('change.select2');

Ver este jsfiddle para ejemplos de estos. Gracias a @minlare por la Solución 2.

Explicación:

Digamos que tengo un mejor amigo seleccionado con los nombres de las personas. Entonces, Bob, Bill y John (en este ejemplo, supongo que el valor es el mismo que el nombre). Primero inicializo select2 en mi select:

$('#my-best-friend').select2();

Ahora selecciono manualmente Bob en el navegador. Luego Bob hace algo malo y ya no me gusta. Entonces el sistema anula la selección de Bob para mí:

$('#my-best-friend').val('').trigger('change');

O digamos que hago que el sistema seleccione el siguiente en la lista en lugar de Bob:

// I have assume you can write code to select the next guy in the list
$('#my-best-friend').val('Bill').trigger('change');  

Notas sobre el sitio web Select 2 (ver Métodos obsoletos y eliminados ) que pueden ser útiles para otros:

.select2 ('val') El método "val" ha quedado en desuso y se eliminará en Select2 4.1. El método en desuso ya no incluye el parámetro triggerChange.

En su lugar, debe llamar directamente a .val en el elemento subyacente. Si necesita el segundo parámetro (triggerChange), también debe llamar a .trigger ("change") en el elemento.

$('select').val('1').trigger('change'); // instead of $('select').select2('val', '1');
PanPipes
fuente
8
Esta es la respuesta correcta: funciona en mono-select y multi-select
Giovanni Di Milia
44
Esta es una solución aceptable solo si uno no tiene acciones personalizadas vinculadas al changeevento (como recargar el formulario). De lo contrario, esas acciones se llamarían de forma redundante al activarse change().
van_folmert
Si esto no funciona correctamente, agregue un setTimeout: setTimeout (function () {$ ("select"). Val ("1"). Trigger ("change");}, 1000);
Abel
@van_folmert Tengo el mismo problema. Idealmente, quiero cambiar lo que se muestra como seleccionado, sin activar un evento (ya que tengo uno personalizado onChange)
onebree
1
Vea mi respuesta a continuación para ver un ejemplo de cómo resolver el problema de
@van_folmert
135

Mirando los documentos select2 , usa los siguientes para obtener / establecer el valor.

$("#select").select2("val"); //get the value
$("#select").select2("val", "CA"); //set the value

@PanPipes ha señalado que esto ha cambiado para 4.x (ve a darle un voto a favor a continuación). valahora se llama directamente

$("#select").val("CA");

Entonces, dentro loadCompletede jqGrid, puede obtener el valor que esté buscando y luego establecer el valor del cuadro de selección.

Aviso de los documentos

Tenga en cuenta que para usar este método debe definir la función initSelection en las opciones para que Select2 sepa cómo transformar la identificación del objeto que pasa en val () al objeto completo que necesita para representar la selección. Si se está adjuntando a un elemento seleccionado, esta función ya está disponible para usted.

Jack
fuente
No parece funcionar con la demostración que estoy viendo. No estoy seguro de por qué, puede tener algo que ver con la forma en que se conecta a JqGrid.
Adam K Dean
1
Se actualizó la respuesta. Parece que tendrá que agregar manualmente esa función a la inicialización select2 para que sepa cómo manejar la valllamada.
Jack
1
@AdamKDean: Uno puede probar adicionalmente si se <select>convirtió al select2control probando la existencia de la clase select2-offscreenen el <select>. Todos los elementos de la barra de herramientas de búsqueda tienen una identificación que comienza con el gs_prefijo y tienen el nombre como en colModel. Puedes usar getGridParampara obtener colModel.
Oleg
Gracias, he logrado obtener la información del filtro, solo necesito una forma de configurarla después de que la barra de filtro se vuelva a crear con la select2selección. Voy a echar otro vistazo hoy, tal vez con ojos frescos puedo arreglarlo. Gracias de nuevo. Actualización: envolver el código en un cheque booleano solucionó el problema que tenía, aunque dejó de actualizar la barra de búsqueda en lugar de seleccionar nuevamente el elemento anterior.
Adam K Dean
32
this.$("#yourSelector").select2("data", { id: 1, text: "Some Text" });

Esto debería ser de ayuda.

Yasser Shaikh
fuente
3
Ejemplo de valores múltiples: this. $ ("# YourSelector"). Select2 ("data", [{id: 1, text: "Some Text"}, {id: 2, text: "Some Other Text"}]);
RodneyRd
18

Esto debería ser aún más fácil.

$("#e1").select2("val", ["View" ,"Modify"]);

Pero asegúrese de que los valores que pasa ya estén presentes en el HTMl

Neelu
fuente
17

Si desea agregar nuevos value='newValue'y text='newLabel', debe agregar este código:

  1. Agregar nueva opción a <select>:

    var opt = "<option value='newValue' selected ='selected'>" + newLabel+ " </option>";
    $(selLocationID).html(opt);
  2. Activar el <select>cambio al valor seleccionado:

    $(selLocationID).val('newValue').trigger("change");
Trong
fuente
Encuentro esto más limpio que jugar con los 'datos' select2 :) Cambie el dom, deje que select2 descubra el resto.
Paulj
Estoy probando en Safari, y esta es la única solución que realmente funciona. Los otros son más elocuentes y los preferiría, pero más que nada, prefiero el código de trabajo. Y esto es eso. :)
David
¡Un millón de gracias por esto! Estoy trabajando con 2 cuadros seleccionados donde ambos cuadros se rellenan con Ajax y utilicé propiedades de datos adicionales para el primer cuadro para establecer el valor del segundo usando esto. ¡¡¡¡Una vez más, gracias!!!!
Sam
16

Solo quería agregar una segunda respuesta. Si ya ha procesado el select como select2 , deberá reflejarlo en su selector de la siguiente manera:

$("#s2id_originalSelectId").select2("val", "value to select");
Abram
fuente
12

Tiene dos opciones: como dice @PanPipes answer, puede hacer lo siguiente.

$(element).val(val).trigger('change');

Esta es una solución aceptable solo si uno no tiene acciones personalizadas vinculadas al evento de cambio. La solución que uso en esta situación es desencadenar un evento específico select2 que actualiza la selección mostrada select2.

$(element).val(val).trigger('change.select2');
minlare
fuente
Sí, esta es la mejor solución integral. Realmente, creo que Select2 debería activar el evento interno 'change.select2' automáticamente para actualizar la pantalla cuando se cambia el valor. Pero, al menos, proporciona una manera simple de actualizar la pantalla para que coincida con el nuevo valor, sin activar controladores de eventos de cambio personalizados.
DaveInMaine
este '$ (elemento) .val (val) .trigger (' change.select2 ');' trabajó para mi. Gracias @minlare.
Ray
9

Tener algunos problemas para configurar una opción de cadena seleccionada en select2:

Con la opción: "opción cadena1 / opción" utilizada:

$('#select').val("string1").change(); 

PERO con una opción con un valor: valor de la opción "E" string1 / option:

$('#select').val("E").change(); // you must enter the Value instead of the string

Espera que esto ayude a alguien que lucha con el mismo problema.

Aldodzb
fuente
5

si desea seleccionar un solo valor, use $('#select').val(1).change()

si desea seleccionar varios valores, establezca el valor en la matriz para que pueda usar este código $('#select').val([1,2,3]).change()

Utkarsh Pandey
fuente
esto no funcionará si ingresa una cadena entre corchetes.
Utkarsh Pandey
5

Para V4 Select2 si desea cambiar tanto el valor de select2 como la representación de texto del menú desplegable.

var intValueOfFruit = 1;
var selectOption = new Option("Fruit", intValueOfFruit, true, true);
$('#select').append(selectOption).trigger('change');

Esto establecerá no solo el valor detrás de escena, sino también la visualización de texto para select2.

Extraído de https://select2.github.io/announcements-4.0.html#removed-methods

Rmalmoe
fuente
Intente activar ('change.select2'). Trigger ('select2: select'); si solo el cambio no es suficiente
Tebe
4

Mi código esperado:

$('#my-select').val('').change();

funcionando perfectamente gracias a @PanPipes por la útil.

Abdullah Sheik Davood
fuente
4

hacer esto

 $('select#id').val(selectYear).select2();
Jaskaran singh Rajal
fuente
Si bien este código puede responder a la pregunta, proporcionar un contexto adicional con respecto a por qué y / o cómo este código responde a la pregunta mejora su valor a largo plazo.
rollstuhlfahrer
No tengo conocimiento sobre JqGrid, pero con este código puede cambiar el valor de select2 de manera simple
Jaskaran singh Rajal
2

si tiene una fuente de datos ajax, consulte esto para errores gratis

https://select2.org/programmatic-control/add-select-clear-items

// Configurar el control Select2

$('#mySelect2').select2({
    ajax: {
        url: '/api/students'
    }
});

// Obtener el elemento preseleccionado y agregarlo al control

var studentSelect = $('#mySelect2');
$.ajax({
    type: 'GET',
    url: '/api/students/s/' + studentId
}).then(function (data) {
    // create the option and append to Select2
    var option = new Option(data.full_name, data.id, true, true);
    studentSelect.append(option).trigger('change');

    // manually trigger the `select2:select` event
    studentSelect.trigger({
        type: 'select2:select',
        params: {
            data: data
        }
    });
});
usuario3444748
fuente
1

Si desea establecer un elemento seleccionado cuando conoce el texto de la lista desplegable y no conoce el valor, aquí hay un ejemplo:

Supongamos que descubrió una zona horaria y desea establecerla, pero los valores tienen time_zone_iden ellos.

        var timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
        var $select2 = $('#time-zone');
        var selected = $select2.find("option:contains('"+timeZone+"')").val();
        $select2.val(selected).trigger('change.select2'); 
Yevgeniy Afanasyev
fuente
0
// Set up the Select2 control
$('#mySelect2').select2({
    ajax: {
        url: '/api/students'
    }
});

// Fetch the preselected item, and add to the control
var studentSelect = $('#mySelect2');
$.ajax({
    type: 'GET',
    url: '/api/students/s/' + studentId
}).then(function (data) {
    // create the option and append to Select2
    var option = new Option(data.full_name, data.id, true, true);
    studentSelect.append(option).trigger('change');

    // manually trigger the `select2:select` event
    studentSelect.trigger({
        type: 'select2:select',
        params: {
            data: data
        }
    });
});

Fuente: Seleccione 2 documentación

CodeNoob
fuente
0

simplemente puede usar el método get / set para establecer el valor

$("#select").select2("val"); //get the value
$("#select").select2("val", "CA"); //set the value

o puedes hacer esto:

$('#select').val("E").change(); // you must enter the Value instead of the string
Foram Thakral
fuente