Search code examples
javascriptjqueryajaxjquery-select2jquery-select2-4

Select2 JS Loading remote data with Ajax


I am using Select2 JS Version 4.0.0-rc.1 and having trouble loading suggestions with remote Ajax method.

Below are the markups and code

<select class="form-control input-sm" id="selFrame1" name="selFrame1">
   <option> Select Frame </option>
</select>

the JavaScript Jquery

$('#selFrame1').select2({
        ajax: {
          url: siteUrl+"suggest/frames",
          dataType: 'json',
          delay: 250,
          method:'POST',
          data: function (params) {
            return {
            q: params.term, // search term
            page: params.page
            };
         },
         processResults: function (data, page) {
         // parse the results into the format expected by Select2.
         // since we are using custom formatting functions we do not need to
         // alter the remote JSON data

           return {
             results: data.result
           };
          },
         cache: true
        }
});

The Json Result returned by server

{results: [{"Code":"123360000"},{"Code":"123360358"},{"Code":"123364000"},{"Code":"123400000"}], more: false }

I am totally not sure if I need to write specific functions to show suggestions, the comments on the Ajax section say that we should not alter the result Json data.

Now somebody please tell me what more I should to get the code working to show the suggestions.

I guess with the new version of select2 a lot of stuffs have changed.


Solution

  • Your response is being returned as a Select2 3.x response, which is fine. We've provided the processResults method because of this (previously results) so you can modify the response on the client side.

    In your case, your response includes the results key but your processResponse function is referencing a result key which does not exist. If you change it to something like

    processResults: function (data, page) {
    // parse the results into the format expected by Select2.
    // since we are using custom formatting functions we do not need to
    // alter the remote JSON data
    
      return {
        results: data.results,
        pagination: {
          more: data.more
        }
      };
    },
    

    Then things should start working. This also maps the existing more property on the response to the new pagination key that we migrated to in Select2 4.0.