Select2のオートコンプリート入力(SonataAdminを介して構築)がありますが、私の人生では、既知のキー/値ペアにプログラムで設定する方法を理解できません。
JS Fiddle here があります。これはおおよその内容を示しています。知りたいのは、ボタンにどの関数をアタッチできるかです。
ページ上のさまざまな入力に対して呼び出されるjQueryとSelect2 data
およびval
メソッドのあらゆる種類の組み合わせを試しましたが、何も機能していないようです...確かにこれを行う方法はありますか?
-編集-
以下の受け入れられた答えは非常に有用であり、選択を初期化する正しい方法に光を当てるのに役立ち、initSelectionの目的を説明します。
そうは言っても、ここでの私の最大の間違いは、変化を引き起こそうとしていた方法であったようです。
私が使用していた:
$(element).select2('data', newObject).trigger('change');
ただし、これにより、select2のchangeイベント内にadd
オブジェクトが空になります。
代わりに、次を使用する場合:
$(element).select2('data', newObject, true);
その後、コードは正常に機能し、newObject
がselect2のchangeイベントで使用可能になり、値が正しく設定されます。
この追加情報が他の人に役立つことを願っています!
注:質問とこの回答はSelect2 v3用です。 Select2 v4には、v3とは非常に異なるAPIがあります。
問題はinitSelection
関数だと思います。その関数を使用して初期値を設定していますか? Select2のドキュメントがその目的のように聞こえるのは知っていますが、「本質的にこれはid-> object mapping functionである」とも書かれており、それは実装方法ではありません。
何らかの理由で.trigger('change')
を呼び出すと、initSelection
関数が呼び出され、選択した値が「ENABLED_FROM_JS」に戻ります。
initSelection
関数を削除して、代わりに以下を使用して初期値を設定してください。
_autocompleteInput.select2('data', {id:103, label:'ENABLED_FROM_JS'});
_
注:OPはformatResult
およびformatSelection
オプションを提供しています。提供されているように、これらのコールバック関数は、アイテムに「テキスト」プロパティではなく「ラベル」プロパティがあることを想定しています。 ほとんどのユーザーの場合、次のようになります:
_autocompleteInput.select2('data', {id:103, text:'ENABLED_FROM_JS'});
_
initSelection
関数の詳細:
Select2 documentation で「initSelection」を検索すると、要素に初期値があり、要素の.val()
関数が呼び出されたときに使用されることがわかります。これは、これらの値がid
のみで構成されており、Select2がデータオブジェクト全体を必要としているためです(一部は正しいラベルを表示できるようにするため)。
Select2コントロールが静的リストを表示している場合、initSelection
関数は簡単に記述できます(Select2がそれを提供できるようです)。その場合、initSelection
関数はデータリストでid
を検索し、対応するデータオブジェクトを返すだけで済みます。 (ここでは「戻る」と言いますが、実際にはデータオブジェクトを返しません。コールバック関数に渡します。)
あなたの場合、要素には初期値がないため(html内)、initSelection
関数を指定する必要はなく、その.val()
メソッドを呼び出すこともありません。 。 .select2('data', ...)
メソッドを使用してプログラムで値を設定し続けるだけです。
(ajaxを使用する)オートコンプリートにinitSelection
関数を提供する場合、おそらくデータオブジェクトを構築するためにajax呼び出しを行う必要があります。
これはバージョン4以降でテストされていることに注意してください
この議論を見つけて、ようやく進歩することができました: https://groups.google.com/forum/#!topic/select2/TOh3T0yqYr4
最後のコメントは、私が正常に使用できた方法を示しています。
例:
$("#selectelement").select2("trigger", "select", {
data: { id: "5" }
});
これは、ajaxデータと一致し、値を正しく設定するのに十分な情報のようです。これは、カスタムデータアダプターで非常に役立ちました。
初期値を設定するには、jQueryを使用してselect要素に必要なオプションタグを追加し、select2のvalメソッドでこれらのオプションを選択済みとして定義し、最後にselect2の「変更」イベントをトリガーする必要があります。
1.-$('#selectElement').append('<option value=someID>optionText</option>');
2.-$('#selectElement').select2('val', someID, true);
3番目のブール引数は、select2にchangeイベントをトリガーするように指示します。
詳細については、 https://github.com/select2/select2/issues/3057 を参照してください
注意してください、「検証済み」コメントに間違いがあります。
autocompleteInput.select2('data', {id:103, label:'ENABLED_FROM_JS'});
正しい方法は
autocompleteInput.select2('data', {id:103, text:'ENABLED_FROM_JS'});
text
の代わりにlabel
を使用します
例から https://select2.github.io/examples.html
プログラムによるアクセス:
var $example = $(".js-example-programmatic").select2();
var $exampleMulti = $(".js-example-programmatic-multi").select2();
$(".js-programmatic-set-val").on("click", function () { $example.val("CA").trigger("change"); });
$(".js-programmatic-open").on("click", function () { $example.select2("open"); });
$(".js-programmatic-close").on("click", function () { $example.select2("close"); });
$(".js-programmatic-init").on("click", function () { $example.select2(); });
$(".js-programmatic-destroy").on("click", function () { $example.select2("destroy"); });
$(".js-programmatic-multi-set-val").on("click", function () { $exampleMulti.val(["CA", "AL"]).trigger("change"); });
$(".js-programmatic-multi-clear").on("click", function () { $exampleMulti.val(null).trigger("change"); });
これです:
$("#tag").select2('data', { id:8, title: "Hello!"});
.trigger('change')
をフィドルから削除すると、Object {id: 1, label: "NEW VALUE"}
(ログは値が変更される前なので、2回クリックする必要があります)。それはあなたが探しているものですか?
Select2バージョン4+では、実際に特別なことは必要ありません。最後に「変更」イベントトリガーを使用した標準jQueryが機能します。
var $select = $("#field");
var items = {id: 1, text: "Name"}; // From AJAX etc
var data = $select.val() || []; // If you want to merge with existing
$(items).each(function () {
if(!$select.find("option[value='" + this.id + "']").length) {
$select.append(new Option(this.text, this.id, true, true));
}
data.Push(this.id);
});
$select.val(data).trigger('change'); // Standard event notifies select2
Select2ドキュメントには基本的な例があります。 https://select2.org/programmatic-control/add-select-clear-items
あなたがしなければならないのは、値を設定してから実行することです:$ ('#myselect').select2 ();
または$ ('select').select2 ();
。そして、すべてが非常によく更新されます。
まだバージョン3.5以降を使用している場合。 select2.jsをページにどのように参照するかを確認してください。非同期負荷を使用する場合、または負荷を延期する場合。このプラグインの動作は異なる場合があります。
言及する考え。
私の状況では、PHPを使用して、事前に選択したオプションをHTMLサーバー側にレンダリングすることができました。
ページの読み込み中に、オプションの値はすでにわかっているため、<select name="team_search"></select>
は次のようになりました。
<select name="team_search">
<?php echo !empty($preselected_team)
? '<option selected="selected" value="'. $preselected_team->ID .'">' . $preselected_team->team_name . '</option>'
: null ?>
</select>';
ご覧のとおり、$preselected_team
使用可能selected
属性、value
およびラベルが設定されたオプションでレンダリングします。そして、値がない場合、オプションはレンダリングされません。
このアプローチは常に可能とは限りません(OPの場合は言及されていません)が、JavaScriptの実行に先立ってページをロードする準備ができるという追加の利点があります。
バージョン3.5.3の場合
$(".select2").select2('data',{id:taskid,text:taskname}).trigger('change');
John S 'answer に基づいています。 select2を初期化する際にinitSelection
を初期化する場合にのみ、上記が機能しますhoweverオプションは初期化されていません。
$(".select2").select2({
//some setup
})