【发布时间】:2018-11-06 13:11:56
【问题描述】:
当我使用 select2 时,搜索时选项列表并没有减少,当我有超过 50 个选项时,这很烦人..
我使用 symfony4 框架,路由提供我在数据库中的标签:
/**
* @Route("/miseenpage/keywords.json", name="keywords", defaults={"_format": "json"})
*/
然后我用symfony Tags plugin提供的代码初始化我的select2:
$( document ).ready(function() {
initTags($('input[name$="[tagsText]"]'));
});
// TAGS
function initTags($input) {
if($input.length) {
$input.attr('type', 'hidden').select2({
width: '85%',
tags: true,
tokenSeparators: [","],
createSearchChoice: function (term, data) {
if ($(data).filter(function () {
return this.text.localeCompare(term) === 0;
}).length === 0) {
return {
id: term,
text: term
};
}
},
multiple: true,
ajax: {
url: $input.data('ajax'),
dataType: "json",
data: function (term, page) {
return {
q: term
};
},
results: function (data, page) {
return {
results: data
};
}
},
initSelection: function (element, callback) {
var data = [];
function splitVal(string, separator) {
var val, i, l;
if (string === null || string.length < 1) {
return [];
}
val = string.split(separator);
for (i = 0, l = val.length; i < l; i = i + 1) {
val[i] = $.trim(val[i]);
}
return val;
}
$(splitVal(element.val(), ",")).each(function () {
data.push({
id: this,
text: this
});
});
callback(data);
}
});
}
}
如您所见,列表仍然相同,只是结果带有下划线。我想根据我搜索的内容过滤结果,所以在找到带下划线的术语之前,我不必一直滚动。
因为这是Select2的基本工作,我猜我的JS有配置问题。
【问题讨论】:
-
嗨,可能是一个愚蠢的问题,但你为什么要在输入类型 hidden 上初始化你的 select2 ? (确保您正在初始化好的输入)。顺便说一句,一个好的做法是在输入至少 X 个字符后加载结果(以避免多次查询您的服务器)。与您想要做的相比,您的 JS 看起来真的很复杂...
-
我使用了 symfony 的标签插件中的 cookbook,所以我没有编辑代码,因为我的行为应该与常规 select2 相同?除了列表没有减少之外,一切都运行良好
-
这看起来太复杂了(我们在所有项目中都使用了很多 nativ select2)。您使用的是哪个版本的 Select2?你能调试你的关键字函数,看看你是否真的得到了用户在字段中输入的内容吗?
-
使用 select2 v3.5.3。因为它是一个应该填充的选择(数据库中的对象),所以它在加载时已经可以有一些值(我认为这是从常规 select2 添加的代码的一部分)。我找到了一种解决方法,很确定它不是正确的,但可以工作。我在下面发布代码。
-
已经加载的值是用
initSelection部分设置的。如果它足以满足您的需求(可能只有 50 个值),您应该删除所有 ajax 部分。如果不是(如果您必须从 DB 动态加载对象),请告诉我,我会尽力帮助您。
标签: javascript symfony jquery-select2