【问题标题】:select2 display default option (static) and do ajax search if not foundselect2 显示默认选项(静态)并在未找到时进行 ajax 搜索
【发布时间】:2016-07-07 16:15:38
【问题描述】:

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

由于我无法使用相同的选择对象,因此我使用不同的对象进行 ajax 搜索。 所以我隐藏了默认选择并替换为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>

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

谢谢你, 萨兰

【问题讨论】:

    标签: jquery ajax select2 jquery-select2-4


    【解决方案1】:

    我已经解决了在 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');
    
    });
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 2015-09-09
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多