select2几乎正常工作我想要的方式。它会加载所有远程数据,并在更改另一个字段时正确格式化。我想在检索函数中添加检索数据,即一旦检索到数据,用户就可以通过标题(result.title)搜索列表。
在下面的示例中,将检索数据,但不会过滤搜索字词。在用户必须搜索结果之前,首先加载所有远程数据非常重要。
如果我无法添加搜索功能,如何禁用搜索框?如果我设置" minimumResultsForSearch:-1",那么select2框仍然允许我搜索?
var $company2 = $(".company2");
$company2.select2().on('change', function() {
if ($company2.val() !== null) {
$('.unmaintained2').select2({
allowClear: true,
minimumResultsForSearch: 1,
ajax: {
url: "/api/unmaintained2/" + $company2.val(),
processResults: function (data) {
return {
results: data,
};
},
dataType: 'json',
cache: true,
},
escapeMarkup: function(m) {
return m;
},
templateResult: function (result) {
if (result.loading) return 'Loading...';
return result.text + '<h6>' + result.make + ' ' + result.category + '</h6>';
},
});
};
});
答案 0 :(得分:1)
有一个名为matcher
的搜索选项。参见文档
但是这只能用于本地提供的数据。
如果您使用的是远程数据,select2
预计已经过滤了数据。
匹配器仅适用于本地提供的数据(例如,通过数组! 使用远程数据集时,Select2期望返回 结果已在服务器端过滤。
所以我认为,你不能以ajax
选项使用这种方式。
也许您可以在加载页面时加载数据,然后将返回的数据作为option
添加到选择框中。然后使用select2
选项初始化matcher
框。
<强>更新强>
我玩了一下,你可以在加载所有选项后格式化搜索结果。 检查此代码:
function formatState (state) {
if (!state.id) {
return state.text;
}
var state1 = state.text + '<h6>(' + state.id + ') ' + state.text + '</h6>';
return state1;
};
function selection(state) {
return state.text;
}
function makeSelect2(data) {
$('#selectBox').select2({
data: data,
templateSelection: selection,
templateResult: formatState,
escapeMarkup: function (state) {
return state;
},
});
}
$(document).ready(function() {
$.ajax({
type: "POST",
dataType: "json",
async: true,
url: "ajax.php",
data: ({
}),
success: function (data) {
makeSelect2(data);
}
});
});
在$(document).ready
上,选项通过ajax
加载。成功ajax
结果后,将使用makeSelect2
请求的结果调用函数ajax
。
在makeSelect2
函数中,使用给定数据初始化select2
框,并使用templateSelection
和templateResult
选项修改搜索结果外观。
希望这是你的期望。
答案 1 :(得分:0)
感谢下面的@dns_nx是最终的解决方案!现在可以搜索select2(客户端)并使用远程数据进行模拟!
$(document).ready(function() {
var $company2 = $(".company2");
var $equipment2 = $(".equipment2");
$company2.select2().on('change', function() {
$equipment2.empty();
if ($company2.val() !== null) {
$.ajax({
url: "{{ url('/') }}" + "/api/unmaintained2/" + $company2.val(),
type: 'GET',
dataType: 'json',
async: true,
success: function(data) {
$equipment2.select2({
data: data,
templateSelection: function(result) {
return result.text;
},
templateResult: function(result) {
if (!result.id) {
return result.text;
}
var final = '<h2>'+ result.serial + '</h2><h5>(' + result.make + ') ' + result.category + '</h5>';
return final;
},
escapeMarkup: function(result) {
return result;
},
});
}
});
}
}).trigger('change');
});