Come posso modificare il valore selezionato del menu a discesa select2 con JqGrid?


178

Sto usando la demo select2 di Oleg , ma mi chiedo se sarebbe possibile cambiare il valore attualmente selezionato nel menu a discesa.

Ad esempio, se i quattro valori caricati fossero: "Any", "Fruit", "Vegetable", "Meat"e l'elenco a discesa predefinito "Any", come potrei modificarlo "Fruit"in nell'evento JqGrid loadComplete?

È possibile?

Risposte:


407

Per la versione select2> = 4.0.0

Le altre soluzioni potrebbero non funzionare, tuttavia i seguenti esempi dovrebbero funzionare.

Soluzione 1: provoca l'attivazione di tutti gli eventi di modifica associati, incluso select2

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

Soluzione 2: provoca l'attivazione dell'evento di modifica SOLO selezione2

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

Vedi questo jsfiddle per esempi di questi. Grazie a @minlare per la soluzione 2.

Spiegazione:

Di 'che ho un migliore amico che seleziona i nomi delle persone. Quindi Bob, Bill e John (in questo esempio suppongo che il valore sia lo stesso del nome). Per prima cosa inizializzo select2 sulla mia selezione:

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

Ora seleziono manualmente Bob nel browser. Successivamente Bob fa qualcosa di cattivo e non mi piace più. Quindi il sistema deseleziona Bob per me:

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

Oppure dire che faccio selezionare al sistema il successivo nell'elenco anziché Bob:

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

Note sul sito Web Select 2 (consultare Metodi obsoleti e rimossi ) che potrebbero essere utili per gli altri:

.select2 ( 'val') Il metodo "val" è stato deprecato e verrà rimosso in Select2 4.1. Il metodo obsoleto non include più il parametro triggerChange.

Dovresti invece chiamare direttamente .val sull'elemento sottostante. Se hai bisogno del secondo parametro (triggerChange), dovresti anche chiamare .trigger ("change") sull'elemento.

$('select').val('1').trigger('change'); // instead of $('select').select2('val', '1');

8
Questa è la risposta giusta: funziona sia in mono-selezione che in multi-selezione
Giovanni Di Milia,

4
Questa è una soluzione accettabile solo se non si hanno azioni personalizzate vincolate changeall'evento (come ricaricare il modulo). Altrimenti quelle azioni sarebbero chiamate in modo ridondante quando innescate change().
van_folmert,

Se questo non funziona correttamente, aggiungi un setTimeout: setTimeout (function () {$ ("select"). Val ("1"). Trigger ("change");}, 1000);
Abel,

@van_folmert Ho lo stesso problema. Idealmente, voglio cambiare ciò che viene mostrato come selezionato, senza innescare un evento (dato che ne ho uno personalizzato associato onChange)
onebree

1
Vedi la mia risposta di seguito per un esempio di come risolvere il problema
@van_folmert

135

Guardando il documenti select2 si usa il seguito per ottenere / impostare il valore.

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

@PanPipes ha sottolineato che questo è cambiato per 4.x (vai a lanciare un voto sotto). valviene ora chiamato direttamente

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

Quindi all'interno loadCompletedi jqGrid puoi ottenere qualunque valore tu stia cercando quindi impostare il valore di selectbox.

Avviso dai documenti

Si noti che per utilizzare questo metodo è necessario definire la funzione initSelection nelle opzioni in modo che Select2 sappia come trasformare l'id dell'oggetto che si passa in val () all'intero oggetto che deve rendere la selezione. Se si esegue il collegamento a un elemento selezionato, questa funzione è già disponibile.


Non sembra funzionare con la demo che sto guardando. Non so perché, potrebbe essere qualcosa a che fare con il modo in cui si collega a JqGrid.
Adam K Dean,

1
Aggiornato la risposta. Sembra che dovrai aggiungere manualmente quella funzione all'inizializzazione select2 in modo che sappia come gestire la valchiamata.
Jack,

1
@AdamKDean: si può verificare ulteriormente se <select>convertito in select2controllo verificando l'esistenza della classe select2-offscreensul <select>. Tutti gli elementi della barra degli strumenti di ricerca hanno un id che inizia con il gs_prefisso e ha il nome come in colModel. Puoi usare getGridParamper ottenere colModel.
Oleg,

Grazie, sono riuscito a ottenere le informazioni sul filtro, ho solo bisogno di un modo per impostarlo dopo che la barra del filtro è stata ricreata con la select2selezione. Daro 'un'altra occhiata oggi, forse con occhi nuovi posso sistemarlo. Grazie ancora. Aggiornamento: il wrapping del codice in un controllo booleano ha risolto il problema che stavo riscontrando, anche se ha interrotto l'aggiornamento della barra di ricerca piuttosto che selezionare nuovamente l'elemento precedente.
Adam K Dean,


32
this.$("#yourSelector").select2("data", { id: 1, text: "Some Text" });

questo dovrebbe essere di aiuto.


3
Esempio di valori multipli: this. $ ("# YourSelector"). Select2 ("data", [{id: 1, text: "Some Text"}, {id: 2, text: "Some Other Text"}]);
Rodney,

18

Questo dovrebbe essere ancora più semplice.

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

Ma assicurati che i valori che passi siano già presenti in HTMl


17

Se vuoi aggiungere nuovo value='newValue'e text='newLabel', dovresti aggiungere questo codice:

  1. Aggiungi nuova opzione a <select>:

    var opt = "<option value='newValue' selected ='selected'>" + newLabel+ " </option>";
    $(selLocationID).html(opt);
  2. Attiva la <select>modifica al valore selezionato:

    $(selLocationID).val('newValue').trigger("change");

Trovo questo più pulito del pasticciare con i "dati" di select2 :) Cambia la dom, lascia che select2 capisca il resto.
Paulj,

Sto testando su Safari, e questa è l'unica soluzione che funziona davvero. Gli altri sono più eloquenti e li preferirei, ma soprattutto preferisco il codice di lavoro. E questo è quello. :)
David

Grazie mille per questo! Sto lavorando con 2 caselle selezionate in cui entrambe le caselle sono popolate con Ajax e ho usato proprietà di dati extra per la prima casella per impostare il valore della seconda utilizzando questo. Grazie ancora!!!!
Sam,

16

Volevo solo aggiungere una seconda risposta. Se hai già eseguito il rendering della selezione come select2 , dovrai rifletterla nel selettore nel modo seguente:

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

12

Hai due opzioni: come afferma la risposta di @PanPipes, puoi fare quanto segue.

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

Questa è una soluzione accettabile solo se non si hanno azioni personalizzate associate all'evento di modifica. La soluzione che utilizzo in questa situazione è quella di attivare un evento specifico select2 che aggiorna la selezione visualizzata select2.

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

Sì, questa è la migliore soluzione completa. In realtà, penso che Select2 dovrebbe attivare automaticamente l'evento "change.select2" interno per aggiornare il display quando il valore viene modificato. Ma questo almeno fornisce un modo semplice per aggiornare il display in modo che corrisponda al nuovo valore, senza attivare gestori di eventi di modifica personalizzati.
DaveInMaine,

questo '$ (element) .val (val) .trigger (' change.select2 ');' ha funzionato per me. Grazie @minlare.
Ray,

9

Problemi con l'impostazione di un'opzione String selezionata in un select2:

Con l'opzione: "opzione stringa1 / opzione" utilizzata:

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

MA con un'opzione con un valore: valore dell'opzione "E" stringa1 / opzione:

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

Spera che questo aiuti qualcuno alle prese con lo stesso problema.


5

se si desidera selezionare un singolo valore, utilizzare $('#select').val(1).change()

se si desidera selezionare più valori, impostare il valore nell'array in modo da poter utilizzare questo codice $('#select').val([1,2,3]).change()


questo non funzionerà se inserisci la stringa tra parentesi quadre.
Utkarsh Pandey,

5

Per V4 Select2 se si desidera modificare sia il valore di select2 sia la rappresentazione testuale del menu a discesa.

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

Questo imposterà non solo il valore dietro le quinte ma anche la visualizzazione del testo per select2.

Estratto da https://select2.github.io/announcements-4.0.html#removed-methods


Prova a trigger ('change.select2'). Trigger ('select2: select'); se il solo cambiamento non è abbastanza
Tebe,

4

Il mio codice previsto:

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

funziona perfettamente grazie a @PanPipes per l'utile.


4

Fai questo

 $('select#id').val(selectYear).select2();

Mentre questo codice può rispondere alla domanda, fornendo un contesto aggiuntivo riguardo al perché e / o al modo in cui questo codice risponde alla domanda migliora il suo valore a lungo termine.
rollstuhlfahrer

Non ho conoscenza di JqGrid ma con questo codice è possibile modificare il valore select2 in modo semplice
Jaskaran singh Rajal

2

se si dispone di una fonte di dati Ajax, si prega di fare riferimento a questo per bug gratuitamente

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

// Imposta il controllo Select2

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

// Recupera l'elemento preselezionato e aggiungilo al controllo

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
        }
    });
});

1

se si desidera impostare un elemento selezionato quando si conosce il testo dall'elenco a discesa e non si conosce il valore, ecco un esempio:

Supponiamo che tu abbia capito un fuso orario e desideri impostarlo, ma i valori hanno time_zone_idin essi.

        var timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
        var $select2 = $('#time-zone');
        var selected = $select2.find("option:contains('"+timeZone+"')").val();
        $select2.val(selected).trigger('change.select2'); 

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
        }
    });
});

Carattere: selezionare 2 documentazione


0

puoi semplicemente usare il metodo get / set per impostare il valore

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

oppure puoi farlo:

$('#select').val("E").change(); // you must enter the Value instead of the string
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.