14

下面是我尝试appendTo使用带有 AJAX 源的 jQuery 自动完成功能。

我有多个问题,希望能帮助许多正在努力理解使用 AJAX 源实现自动完成的正确方法的其他人。

1)source: function(request, response) {...} 这是做什么的?为什么需要它。

2) 以什么格式function(data){ response($.map (data, function(obj) {返回数据?我意识到数据是 JSON 格式,但是有什么意义.map呢?有必要这样做吗?有好处吗?

3a) 使用appendToandrenderItem时,是否需要返回上述success数据?

3b) 或者,根据上述数据,您如何正确使用 appendTo 和 renderItem 来更改检索值的格式和显示?

$(function() {
$( ".find_group_ac" ).autocomplete({
        minLength: 1,
        source: function(request, response) {
            $.ajax({
                url: "welcome/search/",
                data: { term: $(".find_group_ac").val()},
                dataType: "json",
                type: "POST",
                success: function(data){ response($.map
                        (data, function(obj) {
                            return {
                            label: obj.name + ': ' + obj.description,
                            value: obj.name,
                            id: obj.name
                };}));}
            });
        }
    }).data( "autocomplete" )._renderItem = function( ul, item ) {
            return $( "<li></li>" )
                .data( "item.autocomplete", item )
                .append( "<a>" + item.label + "<br>" + item.desc + "</a>" )
                .appendTo( ul );
        };
});

这似乎有很多要回答的问题,但我相信它对许多 javascript 新手和我自己来说都是有价值的。

4

1 回答 1

33

source: function(request, response) {...}这是做什么的?为什么需要它。

由于您正在执行自定义 AJAX POST 来获取数据,因此您必须指定一个函数,该函数response使用所需的自动完成候选者调用回调。

在最简单的用例中,您只需为source参数提供一个字符串,小部件将针对该 URL 发出一个 GET 请求,并附加一个?term=(term). 由于您正在执行 POST 并发送不同的术语,因此您必须使用source.

PS:您应该提供$.ajax呼叫request.term而不是$(".find_group_ac").val()


function(data){ response($.map (data, function(obj) { 以什么格式返回数据?我意识到数据是JSON格式的,但是.map有什么意义?有必要这样做吗? ? 有什么好处吗?

自动完成小部件需要一个数组数据源,其项目满足以下要求之一:

  1. 该项目必须是单个字符串,或者:
  2. 该项目必须是具有label属性、a value、属性或两者兼有的对象。

考虑到这一点,如果您使用的服务器端资源的 JSON以这种方式格式化,则必须先转换数据以满足这些规范,然后再将其提供给response函数。执行此操作的常用方法是使用$.map,它遍历数组并转换每个元素。


使用appendToandrenderItem时,是否需要返回上述成功数据?

不,但它们经常一起使用。

假设您有一个额外的属性(如description)要显示在候选列表中。在这种情况下,您可能会将服务器端结果转换为自动完成所期望的格式(包括但仍包括) label,但您还希望显示该属性。在这种情况下,您需要重载.valuedescriptiondescription_renderItem


或者,根据上述数据,您如何正确使用 appendTo 和 renderItem 来更改检索值的格式和显示?

如果上面提出的问题在这个答案中得到了充分回答,那么我需要做的就是发布一些将这些概念结合在一起的代码:

$( ".find_group_ac" ).autocomplete({
    minLength: 1,
    source: function(request, response) {
        $.ajax({
            url: "welcome/search/",
            data: { term: $(".find_group_ac").val()},
            dataType: "json",
            type: "POST",
            success: function(data) { 
                response($.map(data, function(obj) {
                    return {
                        label: obj.name,
                        value: obj.name,
                        description: obj.description,
                        id: obj.name // don't really need this unless you're using it elsewhere.
                    };
                }));
            }

        });
    }
}).data( "autocomplete" )._renderItem = function( ul, item ) {
    // Inside of _renderItem you can use any property that exists on each item that we built
    // with $.map above */
    return $("<li></li>")
        .data("item.autocomplete", item)
        .append("<a>" + item.label + "<br>" + item.description + "</a>")
        .appendTo(ul);
};

jQueryUI 的自动完成文档页面上的示例实际上非常广泛并且可能会有所帮助。具体来说,一定要检查:

于 2012-07-30T21:38:53.910 回答