Из вашего вопроса я понял, что вы хотите иметь возможность показывать option
s для выбора, когда есть совпадение либо в тексте option
, либо в атрибуте родительского значения optgroup
option
.
Это относительно просто: посмотрите на оба значения и, если одно из них совпадает, return true
используйте параметр matcher
в Select2:
(Примечание. Использование Select2 v3.5.4.)
(function() {
function matcher(term, text, opt) {
var $option = $(opt),
$optgroup = $option.parent('optgroup'),
label = $optgroup.attr('label');
term = term.toUpperCase();
text = text.toUpperCase();
if (text.indexOf(term) > -1
|| (label !== undefined
&& label.toUpperCase().indexOf(term) > -1)) {
return true;
}
return false;
}
$(".select2").select2({
matcher: matcher
});
})();
https://jsfiddle.net/xfw4tmbx/2/
v4.* и выше изменили term
и text
на более сложный объект, поэтому он будет немного отличаться, но основная концепция та же. Как видите, все, что я делаю, — это использую jQuery для выбора родительского элемента option
, если это элемент optgroup
, и включаю его в проверку matcher
.
Кроме того, optgroup
будет отображаться, если показаны какие-либо из его дочерних элементов, поэтому вам нужно беспокоиться только об отображении одного или нескольких option
, а не на самом деле «показывать» optgroup
, показывая его вручную.
Если у вас есть другое требование, предоставьте демонстрационную скрипту (работающую/неработающую?), показывающую, что у вас есть, где мы можем ее запустить.
ИЗМЕНИТЬ
Пользовательское сопоставление Select2 значительно изменилось в версии 4.0. Вот пользовательский сопоставитель, опубликованный в этой проблеме GitHub. Он воспроизводится ниже для полноты картины.
Обратите внимание, что он вызывает себя для дочерних элементов (элементов option
внутри элементов optgroup
), поэтому modelMatcher()
работает с элементами optgroup
и option
, но объединенный набор возвращается после удаления optgroup
и option
элементы, которые не совпадают. В приведенной выше версии вы получали каждый элемент option
и просто возвращали true/false, если хотели, чтобы он (и родитель) отображался. Не намного сложнее, но вам нужно подумать об этом немного больше.
(function() {
function modelMatcher(params, data) {
data.parentText = data.parentText || "";
// Always return the object if there is nothing to compare
if ($.trim(params.term) === '') {
return data;
}
// Do a recursive check for options with children
if (data.children && data.children.length > 0) {
// Clone the data object if there are children
// This is required as we modify the object to remove any non-matches
var match = $.extend(true, {}, data);
// Check each child of the option
for (var c = data.children.length - 1; c >= 0; c--) {
var child = data.children[c];
child.parentText += data.parentText + " " + data.text;
var matches = modelMatcher(params, child);
// If there wasn't a match, remove the object in the array
if (matches == null) {
match.children.splice(c, 1);
}
}
// If any children matched, return the new object
if (match.children.length > 0) {
return match;
}
// If there were no matching children, check just the plain object
return modelMatcher(params, match);
}
// If the typed-in term matches the text of this term, or the text from any
// parent term, then it's a match.
var original = (data.parentText + ' ' + data.text).toUpperCase();
var term = params.term.toUpperCase();
// Check if the text contains the term
if (original.indexOf(term) > -1) {
return data;
}
// If it doesn't contain the term, don't return anything
return null;
}
$(".select2").select2({
matcher: modelMatcher
});
})();
https://jsfiddle.net/xfw4tmbx/16/
person
Jared Farrish
schedule
17.03.2016
data.indexOf
в Select2. Вы уверены, что ошибка Select2? - person Clavin   schedule 17.03.2016