select2 显示默认选项(静态),如果找不到则进行 ajax 搜索

select2 display default option (static) and do ajax search if not found

我有 select2 v4 和静态 select(100 个选项)。 当在默认选项列表中找不到用户输入时,我需要进行 ajax 搜索。

由于我无法使用相同的 select 对象,因此我使用了不同的 ajax 搜索。 所以我隐藏了默认的 select 并替换为 ajax_select。 执行 ajax 搜索。

代码:

<script type="text/javascript">

    var s2_search =''; //global var for search string

    $("#default_select").select2({
        placeholder: "Select an item",
        debug: true,
        minimumInputLength: 0, // important!!! => without setting to 0 the default data will not be shown

        tags:true,
        createTag: function (params) {
            s2_search = params.term; //assing search string to var
        },

        templateResult: function(data){

            var $result = $("<span></span>");

            $result.text(data.text);

            return $result;
        },
        escapeMarkup: function (markup) {
            if(markup == 'No results found'){
               // item is not found in default activate the ajax select
                $('#div_default').addClass('hidden');
                $('#div_new').removeClass('hidden');
                new_select_func(s2_search)
            }
            else {
                return markup;
            }
        }
    });

    var $myselect = $('#new_select').select2({
        minimumInputLength: 0,
        ajax: {
            url: BASE_URL + '/get_more',
            dataType: 'json',
            cache: true,
            delay: 350,
            data: function (params) {
                return {
                    q: params.term//, // search term
                };
            },
            processResults: function (data, params) {
                if(data === false){
                    // if the item is not found in the database display a modal form to insert the item
                    // This works 
                    $.get(BASE_URL+'/get_new_form',{plate: params.term}, function (data) {
                        $('#myModal').find('.modal-body').html(data);
                    });
                    $('#myModal').modal('show');
                }
                else {
                    return {
                        results: data 
                    };
                }
            }
        },
        templateSelection: formatNewSelection 

    });

    function formatNewSelection(data, container) {

        // append the new item to the default select
        $("#default_select").append($('<option>', {value: data.id, text: data.text}));
        //restore default select 
        $('#div_default').removeClass('hidden');
        // hide new select
        $('#div_new').addClass('hidden');

        return data.text;
    }
    function new_select_func(search_val) {
        //close default select 
        $("#default_select").select2("close");
        //open new select 
        $myselect.select2('open');
        // set search string and trigger ajax search
        var $search = $myselect.data('select2').dropdown.$search || $myselect.data('select2').selection.$search;
        $search.val(search_val);
        $search.trigger('keyup');

    }
</script>

绝对不是最好的方法,但我只有一个问题。当我 select ajax_select 中的一个项目将其附加到默认值 select 时,它会创建相同的选项 4 次。 谁能告诉我为什么,还有更好的方法吗?

谢谢, 萨兰

我已经解决了在 ajax_select (new_select) 中进行选择时附加到 default_select 的多个选项。问题出在 templateSelection 函数 formatNewSelection 上,我已将其替换为 select2:select 事件。

new_select 的代码:

var $myselect = $('#new_select').select2({
    minimumInputLength: 0,
    ajax: {
        url: BASE_URL + '/get_more',
        dataType: 'json',
        cache: true,
        delay: 350,
        data: function (params) {
            return {
                q: params.term//, // search term
            };
        },
        processResults: function (data, params) {
            if(data === false){
                // if the item is not found in the database display a modal form to insert the item
                // This works 
                $.get(BASE_URL+'/get_new_form',{plate: params.term}, function (data) {
                    $('#myModal').find('.modal-body').html(data);
                });
                $('#myModal').modal('show');
            }
            else {
                return {
                    results: data 
                };
            }
        }
    } 
   // the Selection template and function are not needed using default format
   //,templateSelection: formatNewSelection 

});

$myselect.on("select2:select",  function(e) {

    // append the new item to the default select
    $("#default_select").append($('<option>', {value: e.params.data.id, text: e.params.data.text}));
    //restore default select 
    $('#div_default').removeClass('hidden');
    // hide new select
    $('#div_new').addClass('hidden');

});

这仍然不是最好的编码,但现在可以用了。 将不胜感激任何有关改进这一点的帮助。