Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Setting default values in select2 with AJAX call?

I have two examples.

This one is with a normal select2 with static inputs which works with default fields beforehand: http://jsfiddle.net/z96Ca/2/

Next is a select2 with an ajax call and the default values are not being added into the box - why?! http://jsfiddle.net/z96Ca/1/

I've been fiddling for a while but can't work out how to add the values beforehand when there's an ajax call as well.

Here's the line that usually adds the code beforehand:

$(test).val(["test1","test2"]).trigger("change");

Hope I'm clear enough

Thanks a lot

like image 820
Jack Avatar asked Mar 13 '14 23:03

Jack


People also ask

How can I set the initial value of select2 when using Ajax?

select2({ ajax: { url: "/admin/api/transactions/creditorlist", dataType: 'json', delay: 250, data: function (params) { return { q: params. term, c_id: initial_creditor_id, page: params.

How do I set select2 values?

$("#programid"). select2({ placeholder: "Select a Program", allowClear: true, minimumInputLength: 3, ajax: { url: "ajax.

How do I create a select2 dynamically?

Select2 jQuery plugin is easy to add on the <select > element. Need to call the select2() method on the selector to initialize. If you adding select2 on a class or select element and when you add an element dynamically then select2 is not initialized on that element.


2 Answers

Since you are backing your Select2 with an input element, rather than a select element, and it allows multiple selection, I believe you need to define an initSelection function.

Add the following option:

initSelection: function (element, callback) {
    callback($.map(element.val().split(','), function (id) {
        return { id: id, text: id };
    }));
}

jsfiddle


Note: Instead of calling the following:

$(test).val(["test1","test2"]).trigger("change");

You could have called this:

$(test).select2('val', ["test1","test2"], true);

And when you do that without defining an initSelection function, you get the following error:

Error: Error: val() cannot be called if initSelection() is not defined


Note: I think the reason your first (non-ajax) example works without defining an initSelection function is because it specifies the tags option.


UPDATE: Select2 v4

When using Select2 v4, you should always back the Select2 control with a <select> element, not a hidden input.

<select id="test" style="width: 300px;" multiple="multiple">
</select>

Note: You can still specify multiple: true in the options, but you can also use the multiple attribute of the <select> element.

You can set default values by including selected options in the html or by programmatically adding selected options to the <select> element, after which you should trigger a change-event on the element so its display is updated.

$test.append('<option value="initial1" selected="selected">initial1</option>');
$test.append('<option value="initial2" selected="selected">initial2</option>');
$test.trigger('change');

In this case, the initSelection function is no longer needed (or allowed).

jsfiddle

Note: Select2 does have a "full" version which supports some backward compatibility. That may also be an option.

like image 132
John S Avatar answered Nov 03 '22 23:11

John S


There is no initSelection in the newer versions of select2.

like image 22
Ysak Avatar answered Nov 03 '22 23:11

Ysak