我正在使用Select2填充下拉列表。如果基础选择包含大量项目,则打开其下拉菜单时 Select2 会变慢。我的下拉菜单中有超过10.000个元素。
这是我的代码:
$.ajax({
url: "/Companies/GetCompanies",
method: "get",
success: function (data) {
if (data != null) {
var newWorkPlaceId = $("#newWorkPlaceId");
newWorkPlaceId.empty();
newWorkPlaceId.append("<option value=''> -- Choose-- </option>");
$.each(data, function (index, item) {
newWorkPlaceId.append(
$('<option>', {
value: item.id,
text: item.text
}, '</option>'));
});
$("#newWorkPlaceId").select2({
placeholder: {
id: "",
placeholder: " -- Choose--"
},
allowClear: true
});
}
clearconsole();
}
});
是否可以使 Select2 小部件(或其他可搜索的下拉列表)响应速度更快?
注意:我正在使用ASP.NET CORE
答案 0 :(得分:0)
如果数据太多,则应该执行某种形式的延迟加载或server-side pagination/filtering,以便在任何时候仅显示x量的行。您不应该在DOM中添加太多元素。否则,您应该在select2组件中实现自己的虚拟滚动功能。
答案 1 :(得分:0)
您必须使用AJAX数据和分页,如下所示
$('#mySelect2').select2({
ajax: {
url: 'https://api.github.com/search/repositories',
data: function (params) {
var query = {
search: params.term,
page: params.page || 1
}
// Query parameters will be ?search=[term]&page=[page]
return query;
}
}
});
示例
$('#mySelect2').select2({
ajax: {
url: function (params) {
return 'https://api.github.com/search/repositories?q='+params.term+'&page='+params.page || 1;
},
processResults: function (data) {
return {
results: $.map(data.items, function (item) {
return {
text: item.name,
id: item.id
}
})
};
}}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>
<select style="width:50%" id="mySelect2"></select>
答案 2 :(得分:0)
经过长期研究,我发现2个符号限制将有助于解决此问题。这是我的解决方法
$("#newWorkPlaceId").select2({
allowClear: true,
placeholder: {
id: "",
placeholder: "Choose."
},
language: {
inputTooShort: function (args) {
return "2 or more symbol.";
},
noResults: function () {
return "Not Found.";
},
searching: function () {
return "Searching...";
}
},
minimumInputLength: 2,
ajax: {
url: 'url',
dataType: 'json',
type: "GET",
quietMillis: 50,
data: function(term) {
return {
term: term.term
};
},
processResults: function (response) {
return {
results: response
};
}
}
});