2013-03-05 62 views
9

我是Select2的新手,并且无法集成AJAX。当我搜索时,结果不会根据查询进行过滤。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

我也希望有一个更好的办法来做到这一点!如果我已经有了所有的行,我不觉得直接去服务器进行过滤是很直观的! – 2013-05-06 05:44:56

回答

9

您需要在服务器端编写自定义过滤器来过滤结果。在框中键入的内容保存在'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被使用。如果打开链接http://www.indiewebseries.com/search?q=indhttp://www.indiewebseries.com/search?q=in,获得的结果是不同的并且基于'q'参数。
而在你的情况下,对执行的结果,URL '/概念/ names_for_search?Q = d' 和 '/概念/ names_for_search?Q = DERI' 是一样的(即不过滤)

+0

嘿,谢谢,抱歉,这个回复太晚了。有什么方法可以重用他们的过滤器,就好像我没有在做AJAX(也许从他们的源代码复制/粘贴)?另外,你知道任何你可以指给我的例子吗?光谷歌搜索出乎意料地很少。非常感谢您的帮助 - 一旦我能够鼓励人们,您一定会得到一个。 – 2013-04-01 18:06:43

+1

@MichaelNomitch - 我已经更新了答案。希望这可以帮助。 – darsheets 2013-04-06 08:48:44

2

这个问题被问在github项目上,答案是:在服务器端进行过滤。 当不使用AJAX调用的默认筛选器的功能是目前的选择二文档中的matcher参数:

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