Search code examples
javascriptjqueryhtmljquery-select2

Select2 Default values for multiple select and allowed tags


I have a select 2 multi-select option

<select multiple name="event_type[]" class="form-control" id="selectEvents">
   @foreach ($eTypes as $type)
       <option>{{$type}}</option>
   @endforeach
</select>

I want to set some default values just in case the user is editing the form. I have successfully done that by doing this

var s2 = $("#selectEvents").select2({
    placeholder: "Choose event type",
    tags: true
});

s2.val(["Trade Fair", "CA", "Party"]).trigger("change"); //CA doesn't show as a default

But the problem is i am allowing user generated options using the tags: true option for select2.

When I set a default value that was initially in the html options it works, but when I set a default that was user generated it doesn't work.

It is my first time using select2.

How can i achieve this?


Solution

  • Doing a little digging, I can see this issue raised on GitHub.

    One option is to check to see if the value exists, and append it if it doesn't.

    var s2 = $("#selectEvents").select2({
        placeholder: "Choose event type",
        tags: true
    });
    
    var vals = ["Trade Fair", "CA", "Party"];
    
    vals.forEach(function(e){
    if(!s2.find('option:contains(' + e + ')').length) 
      s2.append($('<option>').text(e));
    });
    
    s2.val(vals).trigger("change"); 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js"></script>
    <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.css" rel="stylesheet"/>
    
    <select multiple name="event_type[]" class="form-control" id="selectEvents">
      <option>Trade Fair</option>
      <option>Party</option>
      <option>Foo</option>
      <option>Bar</option>
    </select>