Select2 Ajax 不根据查询过滤结果

Posted

技术标签:

【中文标题】Select2 Ajax 不根据查询过滤结果【英文标题】:Select2 Ajax not filtering results based on query 【发布时间】:2013-02-20 08:47:15 【问题描述】:

我是 Select2 的新手,在集成 AJAX 时遇到问题。当我搜索时,没有根据查询过滤结果。

它的外观如下:http://i.imgur.com/dAPSSDH.png - 结果中正确的字符带有下划线,但没有过滤掉任何内容。在我的非 ajax Select2 和我看到的示例中,过滤似乎是自动发生的,所以我很犹豫是否要编写自定义过滤器,因为可能已经内置了更好的过滤器。

这是我的代码:

<script>
  $("#search_bar").select2(
    placeholder: "Search for another Concept",
    minimumInputLength: 1,
    ajax:  // instead of writing the function to execute the request we use Select2's convenient helper
      url: "/concepts/names_for_search",
      dataType: 'json',
      data: function (term, page) 
        return 
        q: term, // search term
        page: page
         ;
      ,
      results: function (data, page) 
        return  results: data;
      
    ,
  );
</script>

另外,这是我的 JSON 示例:

["id":1,"text":"Limits","id":2,"text":"Derivatives","id":3,"text":"One-Sided Limits","id":4,"text":"Formal Definition of a limit"]

有什么想法吗?希望我只是在做一些愚蠢的事情,这是一个快速修复。提前感谢您的帮助。

【问题讨论】:

我也希望有更好的方法来做到这一点!如果我已经拥有所有行,我觉得去服务器只是进行过滤并不直观! 【参考方案1】:

您需要在服务器端编写一个自定义过滤器来过滤结果。您在框中键入的内容保存在“term”中,然后“q”作为请求参数与 ajax 调用一起发送。所以ajax调用 url:"/concepts/names_for_search?q=deri" 应该只返回过滤后的结果,而不是所有的结果。

更新 每次您在搜索框中键入时,Select2 都会进行 AJAX 调用。您必须在服务器端过滤结果,然后根据搜索框中的文本返回结果。 我在我的 JSP/Servlet 应用程序中使用它,如下所示

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException  

    String searchTerm = request.getParameter("q");

    String json = getOptions(searchTerm);
    //getOptions method will return a string of  in JSON format
    //["id":"1","name":"Derivatives"]
    response.getWriter().write(json);

您的 javascript 代码是正确的。

我发现 Select2 被使用 here。如果您打开链接http://www.indiewebseries.com/search?q=ind 和http://www.indiewebseries.com/search?q=in,得到的结果是不同的,并且基于“q”参数。 在您的情况下,对 url '/concepts/names_for_search?q=d' 和 '/concepts/names_for_search?q=deri' 的调用结果是相同的(即未过滤)

【讨论】:

嘿,谢谢,很抱歉,这个回复太晚了。有没有办法像我没有做 AJAX 一样重用他们的过滤器(也许从他们的源代码复制/粘贴)?另外,你知道你可以指出我的任何例子吗?轻量级的谷歌搜索出奇地少。非常感谢您的帮助 - 一旦我能够为人们投票,您一定会得到一个。 @MichaelNomitch - 我已经更新了答案。希望这会有所帮助。【参考方案2】:

这个问题是在github项目上问的,答案是:在服务器端过滤。 不使用 AJAX 时调用的默认过滤器函数存在于 Select2 文档中的 matcher 参数中:

function(term, text)  return text.toUpperCase().indexOf(term.toUpperCase())>=0; 

【讨论】:

以上是关于Select2 Ajax 不根据查询过滤结果的主要内容,如果未能解决你的问题,请参考以下文章

如何将模型数据加载到在 Yii 中使用 Ajax 过滤的 Select2 下拉列表

Select2 Ajax 不匹配结果

Select2 ajax不显示结果

Select2 - Ajax 数据 - 根据查询填充下拉列表

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

select2 使用查询词过滤本地 JSON 数据结果