mar*_*nes 5 asp.net-mvc jquery jquery-ui autocomplete jquery-ui-autocomplete
我正在使用JQueryUI自动完成,我想知道如何使用自定义对象作为我的数据源(即我想传回以下类型的列表):
public class Tag
{
public string Name { get; set; }
public int Count { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我正在使用的自动完成代码(当我传回一个直接的字符串数组名称时工作正常)几乎是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;
}
});
});
Run Code Online (Sandbox Code Playgroud)
我从原始演示源中唯一改变的是Url,我在空格而不是逗号上进行分割(对于多个自动完成).
这是HTML:
<div class="ui-widget">
<label for="tags">Tags: </label>
<input id="tags"/>
</div>
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想向用户显示一个名称列表,并附上相应的计数.
如何使用自定义对象作为我的数据源
您需要以小部件期望的方式格式化数据.您必须在结果数组中的每个对象中具有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
};
});
});
},
Run Code Online (Sandbox Code Playgroud)
(未测试)
这应该会为您填充结果.这与您问题的第二部分密切相关:
理想情况下,我想向用户显示一个名称列表,并附上相应的计数.
这个演示作为指南非常容易实现:
$("#auto").autocomplete({ ... })
.data("autocomplete")._renderItem = function(ul, item) {
return $("<li>")
.data("item.autocomplete", item)
.append("<a>" + item.label + "<br />" + item.count + "</a>")
.appendTo(ul);
};
Run Code Online (Sandbox Code Playgroud)
您可以覆盖该_renderItem函数以显示您想要的任何内容,只要它li包含a标记并具有数据即可item.autocomplete.
结合这两种策略,你就应该开展业务.有关此示例,请查看此处的示例:http://jsfiddle.net/andrewwhitaker/UvegL/
此示例组合了远程数据源和自定义数据和显示.希望它会有所帮助,即使AJAX调用有点不同.
| 归档时间: |
|
| 查看次数: |
5336 次 |
| 最近记录: |