带有模板和搜索的 Select2 相关下拉列表
Select2 dependent dropdown with templating and search
我有 2 个列表。当我 select 第一个中的值时,它会更新第二个列表中的选项。只有第二个列表是 Select2。
我成功了,但 Select2 的搜索功能不起作用。
如果我检查 DOM,我注意到 Select2 生成的选项没有文本。是不是因为这个搜索不出来?
这是我的 JS 代码:
$('.category').change(function(event) {
var measure = $(this).parents('.row').find('.measure');
// Modify placeholder when searching
measure.prop('disabled', true).select2({placeholder: "Searching..."});
// Remove existing options of the list (of a previous usage)
measure.children('option').each(function(index, el) {
if ($(el).val().length > 0)
$(el).remove();
});
var DATA = 'tagcat=' + $(this).val();
$.ajax({
type : "GET",
url : $('.custom-table-container').data('search-js'),
data : DATA,
cache : false,
success : function(response) {
var data = JSON.parse(response);
// Update the measures list
measure.select2({
allowClear : true,
data : data.items,
escapeMarkup : function (markup) { return markup; },
templateResult : formatTag,
templateSelection: formatTagSelect
}).prop('disabled', false);
}
});
});
我能够通过在列表中手动添加 HTML 选项来进行搜索,但我丢失了结果模板...
代码:
$.ajax({
// ...
success : function(response) {
var data = JSON.parse(response);
data.items.forEach(function(tag) {
// create the option and append to Select2
var option = new Option(tag.name, tag.id, false, false);
measure.append(option);
});
measure.select2({
allowClear : true,
data : data.items,
escapeMarkup : function (markup) { return markup; },
templateResult : formatTag,
templateSelection : formatTagSelect
}).prop('disabled', false);
}
});
我应该如何对此进行编码以同时具有模板和搜索功能?
抱歉,我刚刚发现我错了:我没有在我的模板结果函数中显示正确的数据。
所以,在一种情况下它起作用是因为特定数据不存在,而在另一种情况下,该数据存在并且它替换了我所做的特定模板......周五下午处理它不是很有效. :D
所以正确的做法是在DOM中手动添加select的选项,然后初始化Select2。
$.ajax({
// ...
success : function(response) {
var data = JSON.parse(response);
// create options in the DOM
data.items.forEach(function(tag) {
// create the option and append to Select2
var option = new Option(tag.name, tag.id, false, false);
measure.append(option);
});
// init Select2 with data
measure.select2({
theme : "bootstrap4",
placeholder : "- Select a measure -",
allowClear : true,
data : data.items,
escapeMarkup : function (markup) { return markup; },
templateResult : formatTag,
templateSelection : formatTagSelect
});
}
});
我有 2 个列表。当我 select 第一个中的值时,它会更新第二个列表中的选项。只有第二个列表是 Select2。
我成功了,但 Select2 的搜索功能不起作用。
如果我检查 DOM,我注意到 Select2 生成的选项没有文本。是不是因为这个搜索不出来?
这是我的 JS 代码:
$('.category').change(function(event) {
var measure = $(this).parents('.row').find('.measure');
// Modify placeholder when searching
measure.prop('disabled', true).select2({placeholder: "Searching..."});
// Remove existing options of the list (of a previous usage)
measure.children('option').each(function(index, el) {
if ($(el).val().length > 0)
$(el).remove();
});
var DATA = 'tagcat=' + $(this).val();
$.ajax({
type : "GET",
url : $('.custom-table-container').data('search-js'),
data : DATA,
cache : false,
success : function(response) {
var data = JSON.parse(response);
// Update the measures list
measure.select2({
allowClear : true,
data : data.items,
escapeMarkup : function (markup) { return markup; },
templateResult : formatTag,
templateSelection: formatTagSelect
}).prop('disabled', false);
}
});
});
我能够通过在列表中手动添加 HTML 选项来进行搜索,但我丢失了结果模板...
代码:
$.ajax({
// ...
success : function(response) {
var data = JSON.parse(response);
data.items.forEach(function(tag) {
// create the option and append to Select2
var option = new Option(tag.name, tag.id, false, false);
measure.append(option);
});
measure.select2({
allowClear : true,
data : data.items,
escapeMarkup : function (markup) { return markup; },
templateResult : formatTag,
templateSelection : formatTagSelect
}).prop('disabled', false);
}
});
我应该如何对此进行编码以同时具有模板和搜索功能?
抱歉,我刚刚发现我错了:我没有在我的模板结果函数中显示正确的数据。
所以,在一种情况下它起作用是因为特定数据不存在,而在另一种情况下,该数据存在并且它替换了我所做的特定模板......周五下午处理它不是很有效. :D
所以正确的做法是在DOM中手动添加select的选项,然后初始化Select2。
$.ajax({
// ...
success : function(response) {
var data = JSON.parse(response);
// create options in the DOM
data.items.forEach(function(tag) {
// create the option and append to Select2
var option = new Option(tag.name, tag.id, false, false);
measure.append(option);
});
// init Select2 with data
measure.select2({
theme : "bootstrap4",
placeholder : "- Select a measure -",
allowClear : true,
data : data.items,
escapeMarkup : function (markup) { return markup; },
templateResult : formatTag,
templateSelection : formatTagSelect
});
}
});