JqG​​ridでselect2ドロップダウンの選択した値を変更するにはどうすればよいですか?


178

私はOlegのselect2デモを使用していますが、ドロップダウンメニューで現在選択されている値を変更できるかどうか疑問に思っています。

たとえば、読み込まれた4つの値が次のとおりで"Any", "Fruit", "Vegetable", "Meat"あり、ドロップダウンリストのデフォルトが"Any"である"Fruit"場合、JqGridイベントでこれをどのように変更できloadCompleteますか?

これは可能ですか?

回答:


407

select2バージョン> = 4.0.0の場合

他のソリューションは機能しない可能性がありますが、次の例は機能するはずです。

解決策1:select2を含むすべてのアタッチされた変更イベントをトリガーします

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

解決策2:JUST select2 changeイベントをトリガーさせる

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

これらの例については、このjsfiddleを参照してください。ソリューション2について@minlareに感謝します。

説明:

親友に人の名前を選んでもらいましょう。したがって、ボブ、ビル、ジョン(この例では、値が名前と同じであると想定しています)。まず、select2をselect2で初期化します。

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

ブラウザで手動でボブを選択します。次のボブはいたずらなことをしていて、私はもう彼を好きではありません。したがって、システムはボブの選択を解除します。

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

または、システムにボブの代わりにリストの次を選択させると言います:

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

他のユーザーに役立つ可能性があるSelect 2 Webサイトに関する注意事項(非推奨および削除されたメソッドを参照):

.select2( 'val') 「val」メソッドは廃止され、Select2 4.1で削除されます。非推奨のメソッドには、triggerChangeパラメータが含まれなくなりました。

代わりに、基になる要素の.valを直接呼び出す必要があります。2番目のパラメーター(triggerChange)が必要な場合は、要素で.trigger( "change")も呼び出す必要があります。

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

8
これが正解です。モノセレクトとマルチセレクトの両方で機能します
Giovanni Di Milia

4
これは、changeイベントにバインドされたカスタムアクション(フォームの再読み込みなど)がない場合にのみ許容できるソリューションです。そうでない場合、これらのアクションはトリガー時に冗長に呼び出されますchange()
van_folmert 2016

これが正しく機能しない場合は、setTimeoutを追加します。setTimeout(function(){$( "select")。val( "1")。trigger( "change");}、1000);
Abel

@van_folmert同じ問題があります。理想的には、イベントを発生させずに、選択されたものとして表示されるものを変更したい(私はカスタムバインドされているのでonChange
onebree

1
@van_folmert問題を解決する方法の例については、以下の私の回答を参照してください
minlare

135

以下を使用して値を取得/設定するselect2ドキュメントを見てください。

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

@PanPipesは、これが4.xで変更されたことを指摘しました(以下の賛成票を投じてください)。val直接呼び出されるようになりました

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

したがってloadComplete、jqGrid 内で、探している値を取得して、selectbox値を設定できます。

ドキュメントからのお知らせ

このメソッドを使用するには、オプションでinitSelection関数を定義する必要があることに注意してください。Select2は、val()で渡すオブジェクトのIDを、選択をレンダリングするために必要な完全なオブジェクトに変換する方法を認識します。select要素にアタッチする場合、この関数はすでに提供されています。


私が見ているデモでは動作しないようです。理由は不明ですが、JqGridにプラグインする方法に関係している可能性があります。
Adam K Dean

1
回答を更新しました。手動でその関数をselect2初期化に追加して、val呼び出しの処理方法がわかるようにする必要があるようです。
ジャック

1
@AdamKDean:上のクラスの存在をテスト<select>するselect2ことにより、コントロールに変換されているかどうかをさらにテストできます。検索ツールバーのすべての要素には、プレフィックスで始まり、のような名前を持つIDがあります。取得に使用できます。select2-offscreen<select>gs_colModelgetGridParamcolModel
Oleg

おかげで、なんとかフィルター情報を取得select2できました。フィルターバーを選択して再作成した後で、フィルター情報を設定する方法が必要です。今日はもう一度見てみましょう。新鮮な目で修正できるかもしれません。再度、感謝します。更新:ブール値チェックでコードをラップすると、以前の要素を再度選択するのではなく、検索バーの更新を停止しましたが、私が抱えていた問題が修正されました。
Adam K Dean


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

これは役に立ちます。


3
複数の値の例:this。$( "#yourSelector")。select2( "data"、[{id:1、text: "Some Text"}、{id:2、text: "Some Other Text"}]);
RodneyRd 14

18

これはさらに簡単になるはずです。

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

ただし、渡す値がすでにHTMlに存在することを確認してください。


17

新しいvalue='newValue'とを追加するtext='newLabel'場合は、次のコードを追加する必要があります。

  1. に新しいオプションを追加<select>

    var opt = "<option value='newValue' selected ='selected'>" + newLabel+ " </option>";
    $(selLocationID).html(opt);
  2. <select>選択した値へのトリガー変更:

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

select2 'data'をいじるよりもこの方がきれいだと思います:) domを変更して、select2が残りを理解できるようにします。
Paulj 2016年

私はSafariでテストしていますが、これが実際に機能する唯一のソリューションです。他のものはより雄弁で、私はそれらを好みますが、何よりも、私は作業コードを好みます。そして、これはそれです。:)
David

百万人にこれをありがとう!私は両方のボックスにAjaxが入力されている2つの選択ボックスで作業しており、最初のボックスに追加のデータプロパティを使用して、これを使用して2番目のボックスの値を設定しました。再びありがとう!!!!
サム

16

2番目の答えを追加したかっただけです。selectを既にselect2としてレンダリングしいる場合は、次のようにセレクターに反映させる必要があります。

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

12

2つのオプションがあります。@ PanPipesが答えるように、次のことができます。

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

これは、変更イベントにバインドされたカスタムアクションがない場合にのみ許容できるソリューションです。この状況で使用する解決策は、select2に表示された選択を更新するselect2固有のイベントをトリガーすることです。

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

はい、これは最高の総合的なソリューションです。本当に、Select2は内部の 'change.select2'イベントを自動的にトリガーして、値が変更されたときに表示を更新する必要があると思います。ただし、これにより、カスタム変更イベントハンドラーをトリガーせずに、新しい値に一致するように表示を更新する簡単な方法が少なくとも提供されます。
DaveInMaine 2017

this '$(element).val(val).trigger(' change.select2 ');' 私のために働いた。@minlareありがとうございます。
Ray

9

select2で選択された文字列オプションの設定に問題があります。

オプション: "option string1 / option"を使用した場合:

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

しかし、値を持つオプション:オプション値 "E" string1 / option:

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

これが同じ問題に苦しんでいる誰かを助けることを願っています。


5

単一の値を選択したい場合は、 $('#select').val(1).change()

複数の値を選択する場合は、配列に値を設定して、このコードを使用できるようにします $('#select').val([1,2,3]).change()


角括弧の下に文字列を入力すると、これは機能しません。
Utkarsh Pandey

5

select2の値とドロップダウンのテキスト表現の両方を変更する場合は、V4 Select2の場合。

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

これにより、舞台裏の値だけでなく、select2のテキスト表示も設定されます。

https://select2.github.io/announcements-4.0.html#removed-methodsから取得


trigger( 'change.select2')。trigger( 'select2:select');を試行します。変更だけでは不十分な場合
Tebe


4

これを行う

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

このコードは質問に答えることがありますが、このコードが質問に答える理由や方法に関する追加のコンテキストを提供すると、長期的な価値が向上します。
rollstuhlfahrer 2018年

JqG​​ridに関する知識はありませんが、このコードを使用すると、select2の値を簡単に変更できます
Jaskaran singh Rajal

2

あなたがajaxデータソースを持っているなら、無料のバグのためにこれを参照してください

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

// Select2コントロールを設定します

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

//事前選択されたアイテムを取得して、コントロールに追加します

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

ドロップダウンリストからのテキストがわかっていて、値がわからないときに選択した項目を設定する場合の例を次に示します。

タイムゾーンを把握して設定したいとしますがtime_zone_id、値はタイムゾーンに含まれています。

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

フォント:2つのドキュメントを選択


0

get / setメソッドを使用して値を設定するだけです

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

またはこれを行うことができます:

$('#select').val("E").change(); // you must enter the Value instead of the string
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.