Question

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

Était-ce utile?

La solution

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.

Autres conseils

There is no initSelection in the newer versions of select2.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top