Select2 JS Loading remote data with Ajax

2020-05-01 04:20发布

问题:

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.

回答1:

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.



回答2:

Your Json response has to be like this :

{
  "total_count":2,
  "items": [
    {"id":"01", "name":"item 1"},
    {"id":"02", "name":"item 2"}
  ]
}

To work, you an id property.

Here is my config :

function formatRepo (repo) {
    if (repo.loading) return repo.text;

    var markup = "<div class='select2-result-repository clearfix'><div class='select2-result-repository__img'><img src='" + repo.img + "' width='80' height='80' /></div><div class='select2-result-repository__meta'><div class='select2-result-repository__title'>" + repo.full_name + "</div>";

    markup += "<div class='select2-result-repository__statistics'><div class='select2-result-repository__type'><i class='fa fa-flash'></i> Type : " + repo.type + "</div><div class='select2-result-repository__usecase'><i class='fa fa-eye'></i> Use case : " + repo.usecase + "</div></div></div></div>";

    return markup;
}

function formatRepoSelection (repo) {
    return repo.full_name;
}

// Init select2
$(".select2").select2({
    ajax: {
        type    : "GET",
        url     : "{{ path('tag_search_js') }}",
        dataType: 'json',
        delay   : 250,
        data    : function (params) {
            return {
                q: params.term, // search term
                page: params.page
            };
        },
        processResults: function (data, params) {
            params.page = params.page || 1;

            return {
                results: data.items,
                pagination: {
                    more: (params.page * 30) < data.total_count
                }
            };
        },
        cache: true
    },
    placeholder: "Select a tag",
    escapeMarkup: function (markup) { return markup; },
    minimumInputLength: 1,
    templateResult: formatRepo,
    templateSelection: formatRepoSelection
});

Hope this helps !