Select2 - Ajax 搜索 - 记住最后的结果

Posted

技术标签:

【中文标题】Select2 - Ajax 搜索 - 记住最后的结果【英文标题】:Select2 - Ajax search - remember last results 【发布时间】:2014-12-15 12:03:47 【问题描述】:

我正在使用 Select2 3.5.1。使用此插件,我可以成功加载远程数据。但是,我今天在这里提出一个问题以改进此搜索。以下是了解我想要做什么的分步说明:

    使用远程数据加载(使用 ajax)设置 Select2。 单击 Select2 输入并搜索内容。 会出现加载,几秒钟后您会看到结果列表。 单击列出的结果之一 - 结果框随即消失。 如果您再次单击搜索框,列表将为空,您需要再次键入一些新文本才能获得结果列表。

是否有可能当我们再次单击搜索框时,先前搜索的结果列表会重新出现而无需任何 ajax 调用?然后,如果用户删除一个字符或更改他的搜索条件,它会再次触发 ajax 搜索。

如果可能,我们将如何编码?

希望我的问题很清楚,如果您有任何问题,请告诉我。谢谢。

这是一个非常简单的代码,我们在其中进行搜索以返回结果列表。它并没有真正进行搜索,但是当您键入内容时它会返回一个列表。我不确定如何使用其中一个响应中提到的 initSelection。

<html>
<head>
    <title>
        Test page for ajax cache
    </title>
    <script type='text/javascript' src='../../resources/javascript/jquery/jquery-1.9.1.min.js'></script>
    <link type='text/css' href='../../resources/javascript/select2/select2.css' rel='stylesheet' />
    <script type='text/javascript' src='../../resources/javascript/select2/select2.js'></script>

    <script>
    $(document).ready(function()
        $('#select').select2(
            ajax: 
                type: 'POST',
                url: 'ajax.php',
                dataType: 'json',
                data: function(term, page)
                    return 
                        autoc: 'country',
                        term: term
                    
                ,
                results: function(data, page)
                    console.log(data);

                    return( results: data.results );
                
            ,
            placeholder: 'Search something',
            minimumInputLength: 3,
            width: '333'
        );
    );
    </script>
</head>

<body>
    <input type='text' name='inputdata' id='select' />
</body>
</html>

非常简单的ajax.php调用:

<?php
$results2['more'] = false;
$results2['results'][0] = array('id'=> "1", 'text'=> "California");
$results2['results'][1] = array('id'=> "2", 'text'=> "Canada");
$results2['results'][2] = array('id'=> "2", 'text'=> "Someword");
$results2['results'][3] = array('id'=> "2", 'text'=> "Alberta");
$results2['results'][4] = array('id'=> "2", 'text'=> "New York");

echo json_encode($results2);

【问题讨论】:

【参考方案1】:

我确实再次阅读了您的帖子。 上次误会你了。

解决方案就在这里。

   $(document).ready(function () 
        $('#select').select2(
            // this part is responsible for data caching
            dataCache: [],
            query: function (q) 
                var obj = this,
                        key = q.term,
                        dataCache = obj.dataCache[key];

                //checking is result in cache
                if (dataCache) 
                    q.callback(results: dataCache.results);
                 else 
                    $.ajax(
                        url: 'ajax.php',
                        data: q: q.term,
                        dataType: 'json',
                        type: 'POST',
                        success: function (data) 
                            //copy data to 'cache'
                            obj.dataCache[key] = data;
                            q.callback(results: data.results);
                        
                    )
                
            ,
            placeholder: 'Search something',
            width: '333',
            minimumInputLength: 3,
        );
        // this part is responsible for setting last search when select2 is opening
        var last_search = '';
        $('#select').on('select2-open', function () 
            if (last_search) 
                $('.select2-search').find('input').val(last_search).trigger('paste');
            
        );
        $('#select').on('select2-loaded', function () 
            last_search = $('.select2-search').find('input').val();
        );
    );

【讨论】:

我添加了一些示例代码。我不确定如何将 initSelection 用于我想做的事情。谢谢。 有机会获得 4.0 版的此代码吗?谢谢【参考方案2】:

这将进行另一个 ajax 调用,但使用与以前相同的查询字符串。使用事件 select2:closure 保存最后一个查询字符串,使用 select2:open 将字符串插入搜索输入并触发输入事件。

var lastQueryString = '';

jQuery(".my-select2").select2(
    minimumInputLength: 2,
    placeholder: "Select an option",
    ajax: 
        url: "/example",
        data: function (params) 
            var query = 
                search: params.term
            
            return query;
        ,
        processResults: function (data) 
            return 
                results: JSON.parse(data)
            ;
        
    
);

jQuery('.my-select2').on('select2:open', function () 
    if (lastQueryString) 
        jQuery('.select2-search').find('input').focus().val(lastQueryString).trigger('input');
    
);

jQuery('.my-select2').on('select2:closing', function () 
    lastQueryString = jQuery('.select2-search').find('input').val();
);

【讨论】:

以上是关于Select2 - Ajax 搜索 - 记住最后的结果的主要内容,如果未能解决你的问题,请参考以下文章

Select2插件ajax方式加载数据并刷新页面数据回显

Select2 通过 AJAX 加载 JSON 结果集并在本地搜索

Select2 ajax不显示结果

如果搜索文本只是空格,则 Select2 不应发送 ajax。如何做到这一点?

如何使用配置了ajax搜索的select2 jquery插件实现选择所有功能。?

在 jquery select2 中更改文本“搜索”