Select2 Ajax Method Not Selecting

后端 未结 6 713
故里飘歌
故里飘歌 2020-12-04 13:46

Ok, I\'m sure there\'s something simple set wrong here but I\'m not 100% what it is.

So I am trying to use Select2 AJAX method as a way of users to search a database

相关标签:
6条回答
  • 2020-12-04 14:24

    You can trigger selecting an option (in this case the first one) by opening the select2 element programmatically and then triggering a return keypress.

    var e = jQuery.Event('keydown');
    e.which = 13;
    
    $('.offer_checkout_page_link select').select2('open');
    $('.offer_checkout_page_link .select2-selection').trigger(e);
    

    This will "set" the option as if you clicked on it. You can modify this to select a specific option by triggering the appropriate number of down keypresses before triggering the return one.

    It seems as though under-the-hood when you click (or in this case hit enter) to select an option, an option element is added to the select element. You will notice that when the page first loads select2 select elements do not have any option element children. This is why other solutions suggest adding an option element using jQuery and then selecting it.

    0 讨论(0)
  • 2020-12-04 14:41

    After looking at another answer it would seem I need to also pass id field with every call, otherwise it will disable the input.

    Sample code that fixed it:

    $('.select2').select2({
      placeholder: "Policy Name",
      minimumInputLength: 3,
      multiple: false,
      quietMillis: 100,
      id: function(bond){ return bond._id; },
      ajax: {
        url: "http://localhost:3000/search",
        dataType: 'json',
        type: 'POST',
        data: function(term, page) {
          return {
            search: term,
            page: page || 1
          }
        },
        results: function(bond, page) {
          return {results: bond.results, more: (bond.results && bond.results.length == 10 ? true: false)}
        }
      },
      formatResult: formatResult,
      formatSelection: formatSelection,
      initSelection: initSelection
    })
    

    Edit

    Since this keeps getting upvoted I'll elaborate a bit. The .select2() method expects a unique id field on all results. Thankfully, there's a workaround. The id option accepts a function like this:

    function( <INDIVIDUAL_RESULT> ) {
      // Expects you to return a unique identifier.
      // Ideally this should be from the results of the $.ajax() call. 
    }
    

    Since my unique identifier was <RESULT>._id, I simply return <RESULT>._id;

    0 讨论(0)
  • 2020-12-04 14:42

    The thing is that the JSON data need a property called "id". There's no need for

    id: function(bond){ return bond._id; }

    If the data does not have an id for itself, you can add it with a function on processResults like here.

            $(YOUR FIELD).select2({
                placeholder: "Start typing...",
                ajax: {
                    type: "POST",
                    contentType: "application/json; charset=utf-8",
                    url: "YOUR API ENDPOINT",
                    dataType: 'json',
                    data: 
                        function (params) {
                            return JSON.stringify({ username: params.term });
                    },
                    processResults: function (data, page) {
    
                        var results = [];
    
                        $.each(JSON.parse(data.d), function (i, v) {
                            var o = {};
                            o.id = v.key;
                            o.name = v.displayName;
                            o.value = v.key;
                            results.push(o);
                        })
    
                        return {
                            results: results
                        };
                    },
                    cache: true
                },
                escapeMarkup: function (markup) { return markup;},
                minimumInputLength: 1,
                templateResult: function (people) {
                    if (people.loading)
                        return people.text;
    
                    var markup = '<option value="' + people.value + '">' + people.name + '</option>';
    
                    return markup;
                },
                templateSelection: function (people) { return people.value || people.text }
    
            });    
    
    0 讨论(0)
  • 2020-12-04 14:42

    Like Dropped.on.Caprica said: Every result item needs an unique id.

    So just assign every result id an unique number:

    $('#searchDriver').select2({
        ajax: {
           dataType: 'json',
           delay: 250,
           cache: true,
           url: '/users/search',
           processResults: function (data, params) {
               //data is an array of results
               data.forEach(function (d, i) {
                   //Just assign a unique number or your own unique id
                   d.id = i; // or e.id = e.userId;
               })
    
               return {
                   results: data
               };
           },
        },
        escapeMarkup: function (markup) { return markup; },
        minimumInputLength: 1,
        templateResult: formatRepo,
        templateSelection: formatRepoSelection
    });
    
    0 讨论(0)
  • 2020-12-04 14:43

    Also be careful with the case. I was using Id but select2 expects id. Could save someone's time.

    0 讨论(0)
  • 2020-12-04 14:46

    I have many problem regarding the following error Option 'ajax' is not allowed for Select2

    In my case, appears for select when you are using select2 version 3.5, So you should upgrade to version 4.0 and you won't need hidden input attached to your select

    0 讨论(0)
提交回复
热议问题