Dynamically add item to jQuery Select2 control that uses AJAX

前端 未结 9 1571
梦毁少年i
梦毁少年i 2020-11-29 02:44

I have a jQuery Select2 control that uses AJAX to populate:



         


        
相关标签:
9条回答
  • 2020-11-29 03:30
    $("#my_select").select2('destroy').empty().select2({data: [{id: 1, text: "new_item"}]});
    
    0 讨论(0)
  • 2020-11-29 03:30

    To get dynamic tagging to work with ajax, here's what I did.

    Select2 version 3.5

    This is easy in version 3.5 because it offers the createSearchChoice hook. It even works for multiple select, as long as multiple: true and tags: true are set.

    HTML

    <input type="hidden" name="locations" value="Whistler, BC" />
    

    JS

    $('input[name="locations"]').select2({
      tags: true,
      multiple: true,
      createSearchChoice: function(term, data) {
        if (!data.length)
          return { id: term, text: term };
        },
      ajax: {
        url: '/api/v1.1/locations',
        dataType: 'json'
      }
    });
    

    The idea here is to use select2's createSearchChoice hook which passes you both the term that the user entered and the ajax response (as data). If ajax returns an empty list, then tell select2 to offer the user-entered term as an option.

    Demo: https://johnny.netlify.com/select2-examples/version3


    Select2 version 4.X

    Version 4.X doesn't have a createSearchChoice hook anymore, but here's how I did the same thing.

    HTML

      <select name="locations" multiple>
        <option value="Whistler, BC" selected>Whistler, BC</option>
      </select>
    

    JS

    $('select[name="locations"]').select2({
      ajax: {
        url: '/api/v1.1/locations',
        dataType: 'json',
        data: function(params) {
          this.data('term', params.term);
          return params;
        },
        processResults: function(data) {
          if (data.length)
            return {
              results: data
            };
          else
            return {
              results: [{ id: this.$element.data('term'), text: this.$element.data('term') }]
            };
        }
      }
    });
    

    The ideas is to stash the term that the user typed into jQuery's data store inside select2's data hook. Then in select2's processResults hook, I check if the ajax response is empty. If it is, I grab the stashed term that the user typed and return it as an option to select2.

    Demo: https://johnny.netlify.com/select2-examples/version4

    0 讨论(0)
  • 2020-11-29 03:32

    This provided a simple solution: Set data in Select2 after insert with AJAX

    $("#select2").select2('data', {id: newID, text: newText});      
    
    0 讨论(0)
提交回复
热议问题