11

我是 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"}]

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

4

2 回答 2

12

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


每次您在搜索框中键入内容时,Update 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 代码是正确的。

I found Select2 is used here. If you open the link http://www.indiewebseries.com/search?q=ind and http://www.indiewebseries.com/search?q=in the results obtained are different and based on the 'q' parameter.
While in you case, the results for calls to url '/concepts/names_for_search?q=d' and '/concepts/names_for_search?q=deri' are the same(i.e. not filtered)

于 2013-03-22T19:55:38.560 回答
3

This question was asked on the github project and the answer was: filter on the server side. The default filter function called when AJAX is not used is present in the Select2 documentation on the matcher parameter:

function(term, text) { return text.toUpperCase().indexOf(term.toUpperCase())>=0; }
于 2014-01-30T18:01:04.067 回答