当搜索没有返回结果时,Select2 过滤器值消失

Posted

技术标签:

【中文标题】当搜索没有返回结果时,Select2 过滤器值消失【英文标题】:Select2 filter values disappear when search returns no results 【发布时间】:2017-01-15 10:20:28 【问题描述】:

我正在使用带有 yadcf 和 select2 的 DataTables 的服务器端实现来增加功能。用于填充表的数据是通过对 Django 视图的 Ajax 请求获取的,select2 自动完成功能的数据也是如此;但来自一个单独的 Django 视图。

我的问题如下。如果搜索查询不会返回结果,则 select2 搜索字段中的值将消失并且无法在 DataTables 中重置 - 您必须改为刷新页面。非 select2 字段中的值仍然可见并且可以重置。

有问题的列中的过滤器类型为multi_select,选择类型为select2。 非问题列中的过滤器类型是 range_daterange_date,使用 bootstrap-datetimepicker 作为日期选择器类型。

下面是我的 select2 列参数。


 "column_number": 3,
 "filter_type": "multi_select",
 "select_type": "select2",
 "select_type_options": 
    dropdownCssClass : 'bigdrop',
    multiple: true,
    minimumInputLength: 1,
    ajax: 
      url: '% url 'ffTestApp:searchData' 'product' %',
      delay: 250,
      dataType: 'json',
      data: function (params) 
        return 
          q: params.term,
          v: yadcf.exGetColumnFilterVal(table,4),
          s: yadcf.exGetColumnFilterVal(table,5)
        ;
      ,
      processResults: function (data, params) 
        params.page = params.page || 1;
        return 
          results: data.items
        ;
      ,
    ,
    escapeMarkup: function (markup)  return markup; ,
    templateResult: function(data) 
      return data.id;
    ,
    templateSelection: function(data) 
      return data.id;
    
  

下面是我用来提供自动完成功能的 Django 视图。

def searchData(request, column):
    try:
        q = request.GET.getlist('q')[0]
    except:
        pass
    else:
        if q != "":
            try:
                products = request.GET.getlist('p[]')
            except:
                pass
            else:
                product_q = list()
                for p in products:
                    product_q.append("p.name=''".format(p))
                if len(product_q)>0:
                    product_q = "() AND ".format(" OR ".join(product_q))
                else:
                    product_q = ""

            try:
                versions = request.GET.getlist('v[]')
            except:
                pass
            else:
                version_q = list()
                for v in versions:
                    version_q.append("tp.version=''".format(v))
                if len(version_q)>0:
                    version_q = "() AND ".format(" OR ".join(version_q))
                else:
                    version_q = ""

            try:
                serials = request.GET.getlist('s[]')
            except:
                pass
            else:
                serial_q = list()
                for v in serials:
                    serial_q.append("s.serial=''".format(v))
                if len(serial_q)>0:
                    serial_q = "() AND ".format(" OR ".join(serial_q))
                else:
                    serial_q = ""

            autoComplete = connection.cursor()
            if column == "product":
                query = "SELECT DISTINCT p.name FROM ffTestApp.ffTestApp_product AS p INNER JOIN ffTestApp.ffTestApp_testprogram AS tp " \
                    "ON tp.product_id=p.id INNER JOIN ffTestApp.ffTestApp_session AS s ON s.test_program_id = tp.id " \
                    "WHERE 12p.name REGEXP '0' ORDER BY p.name ASC;".format(q, version_q, serial_q)
            elif column == "version":
                query = "SELECT DISTINCT tp.version FROM ffTestApp.ffTestApp_testprogram AS tp INNER JOIN ffTestApp.ffTestApp_session AS s " \
                    "ON s.test_program_id=tp.id INNER JOIN ffTestApp_product AS p ON tp.product_id=p.id WHERE 12tp.version REGEXP '0'" \
                    " ORDER by tp.version;".format(q, product_q, serial_q)
            elif column == "serial":
                query = "SELECT DISTINCT s.serial FROM ffTestApp.ffTestApp_session AS s INNER JOIN ffTestApp_testprogram AS tp ON s.test_program_id=tp.id" \
                    " INNER JOIN ffTestApp_product AS p ON tp.product_id=p.id WHERE 12" \
                    "s.serial REGEXP '0' ORDER BY s.serial;".format(q, product_q, version_q)
            elif column == "status":
                query = "SELECT DISTINCT final FROM ffTestApp.ffTestApp_session WHERE final REGEXP '0' ORDER BY final;".format(q)

            autoComplete.execute(query)
            m = []
            for i in autoComplete.fetchall():
                value = dict()
                value["id"] = i
                m.append(value)
            results = "items": m
    return JsonResponse(results, safe=False)

谢谢。

【问题讨论】:

如果没有测试页面的链接就无法提供帮助,您可以尝试使用 ajax 源(来自文件)进行复制并将其托管在任何 js 游乐场网站上 嘿丹尼尔,这个错误似乎也存在于您的一个示例中,已链接。请尝试以下操作:在某些数据列中搜索“某些数据 11”。在“值”列中搜索“b_value”。您会看到 Some Data 列中的搜索参数消失了。 yadcf-showcase.appspot.com/cumulative_filtering.html b_value(以及除a_value,e_value 之外的其他)不应该出现,因为它的cumulative_filtering 模式...会看到为什么... 嗨丹尼尔,有什么更新吗? 哎呀,不,你最好打开一个问题,否则我不会记住它:| 【参考方案1】:

为 select2 添加以下代码:

$('select').select2(
    minimumResultsForSearch: -1
);

【讨论】:

以上是关于当搜索没有返回结果时,Select2 过滤器值消失的主要内容,如果未能解决你的问题,请参考以下文章

Select2 显示当前搜索的值

Select2 Ajax 不根据查询过滤结果

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

Select2 按选项值自动完成

当搜索包含特殊字符时,Azure 搜索服务筛选器 search.ismatch() 未返回正确结果

jQuery.map() 解析 select2 ajax 调用的结果