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 数据 - 根据查询填充下拉列表