【问题标题】:jQuery UI Autocomplete Custom Object as Source rather than String ArrayjQuery UI 自动完成自定义对象作为源而不是字符串数组
【发布时间】:2011-10-24 03:11:23
【问题描述】:

我正在使用 JQueryUI 自动完成功能并且想知道如何使用自定义对象作为我的数据源(即我想传回以下类型的列表):

public class Tag
{
    public string Name { get; set; }
    public int Count { get; set; }
}

我目前使用的自动完成代码(当我传回一个直接的名称字符串数组时工作正常)几乎是 jQuery UI 站点的副本:

$(function () {
        function split(val) {
            return val.split(/ \s*/);
        }
        function extractLast(term) {
            return split(term).pop();
        }

        $("#tags")
        // don't navigate away from the field on tab when selecting an item
        .bind("keydown", function (event) {
            if (event.keyCode === $.ui.keyCode.TAB &&
                    $(this).data("autocomplete").menu.active) {
                event.preventDefault();
            }
        })
        .autocomplete({
            source: function (request, response) {
                $.getJSON("Home/GetTag", {
                    term: extractLast(request.term)
                }, response);
            },
            search: function () {
                // custom minLength
                var term = extractLast(this.value);
                if (term.length < 1) {
                    return false;
                }
            },
            focus: function () {
                // prevent value inserted on focus
                return false;
            },
            select: function (event, ui) {
                var terms = split(this.value);
                // remove the current input
                terms.pop();
                // add the selected item
                terms.push(ui.item.value);
                // add placeholder to get the comma-and-space at the end
                terms.push("");
                this.value = terms.join(" ");
                return false;
            }
        });
    });

与原始演示源相比,我唯一更改的是 URL,并且我将拆分为空格而不是逗号(用于多个自动完成)。

这是 HTML:

<div class="ui-widget">
    <label for="tags">Tags: </label>
    <input id="tags"/>
</div>

理想情况下,我想向用户展示一个姓名列表,旁边有相应的计数。

【问题讨论】:

    标签: jquery asp.net-mvc jquery-ui autocomplete jquery-ui-autocomplete


    【解决方案1】:

    如何使用自定义对象作为我的数据源

    您需要以小部件期望的方式格式化您的数据。您必须在结果数组中的每个对象中具有label 属性或value 属性(或两者),以便小部件显示您的结果。只要满足这些要求,您就可以在对象中包含其他数据。

    要格式化从服务器返回的数据,约定是使用$.map

    source: function (request, response) {
        $.getJSON("Home/GetTag", {
            term: extractLast(request.term)
        }, function (data) {
            response($.map(data, function (item) {
                return {
                    value: item.Name,
                    count : item.Count
                };
            });
        });
    },
    

    (未测试)

    这应该会为您填充结果。这与您问题的第二部分密切相关:

    理想情况下,我想向用户展示一个姓名列表,旁边有相应的计数。

    按照this demo 的指导,这很容易完成:

    $("#auto").autocomplete({ ... })
        .data("autocomplete")._renderItem = function(ul, item) {
            return $("<li>")
                .data("item.autocomplete", item)
                .append("<a>" + item.label + "<br />" + item.count + "</a>")
                .appendTo(ul);
        };
    

    您可以覆盖_renderItem 函数以显示您想要的任何内容,只要它是一个包含a 标记并具有数据item.autocompleteli

    将这两种策略结合起来,您就应该做生意了。有关这方面的工作示例,请查看此处的示例http://jsfiddle.net/andrewwhitaker/UvegL/

    此示例结合了远程数据源和自定义数据和显示。希望它会有所帮助,即使 AJAX 调用有点不同。

    【讨论】:

    • @marcusstarnes:没问题!很高兴能提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 2011-08-24
    相关资源
    最近更新 更多