我正在使用select2,
我已对其进行了设置,因此如果新标记不存在,我可以添加它,
我也在使用twitter bootstrap,
如果标签不存在,我想将其标记为新标签,为此我将'<span class="label label-important">New</span> '
这个文本作为我的select2初始化程序添加。
$('#newVideoCategory').select2({
placeholder: 'Select a category...',
data: categories,
createSearchChoice: function (term, data) {
if ($(data).filter(function () {
return this.text.localeCompare(term) === 0;
}).length === 0) {
return {id: term, text: '<span class="label label-important">New</span> ' + term};
}
},
initSelection: function (element, callback) {
$(categories).each(function () {
if (this.id == element.val()) {
callback(this);
return;
}
})
}
})
现在这很棒
除非我为标签输入的内容作为该标签的标记的一部分存在
根据我收集的内容,我需要覆盖formatResult
,formatSelection
或matcher
。
这是我从文档中得到的,但我不明白我需要如何改变它。
答案 0 :(得分:7)
感谢您发布(并回答)这个问题!我想我找到了一种更简单的解决方法:
...
createSearchChoice:function(term, data) {
if ($(data).filter(function() {
return this.text.localeCompare(term) === 0;
}).length === 0) {
return {id:term, text: term, isNew: true};
}
},
formatResult: function(term) {
if (term.isNew) {
return '<span class="label label-important">New</span> ' + term.text;
}
else {
return term.text;
}
},
...
您可以从createSearchChoice()
函数返回任何对象,因此只需添加一个字段,告诉formatResult()
这是一个新项目。
这样,返回项目的文本只是您想要的文本,formatResult()
更加简单。
答案 1 :(得分:1)
嗯,
通过覆盖formatResult
函数来获得它。
基本上我们做的是检查第一个字符是否是我们的newTagMark
,如果是,那么我们将其剥离,应用匹配的逻辑,然后再将它添加到吐出来。
大部分逻辑实际上只是select2的内部markMatch
函数的复制和粘贴。
var newTagMark = '<span class="label label-important">New</span> ';
$('#newVideoCategory').select2({
placeholder: 'Select a category...',
data: categories,
createSearchChoice: function (term, data) {
if ($(data).filter(function () {
return this.text.localeCompare(term) === 0;
}).length === 0) {
return {id: term, text: newTagMark + term};
}
},
initSelection: function (element, callback) {
$(categories).each(function () {
if (this.id == element.val()) {
callback(this);
return;
}
})
},
formatResult: function(result, container, query) {
var text = result.text;
var term = query.term;
var markup=[];
var marked = false;
if(text.substr(0, newTagMark.length) == newTagMark){
text = text.substr(newTagMark.length);
markup.push(newTagMark);
}
var match=text.toUpperCase().indexOf(term.toUpperCase()),
tl=term.length;
if (match<0) {
markup.push(text);
return;
}
markup.push(text.substring(0, match));
markup.push("<span class='select2-match'>");
markup.push(text.substring(match, match + tl));
markup.push("</span>");
markup.push(text.substring(match + tl, text.length));
return markup.join("");
}
});
答案 2 :(得分:0)
包含匹配标记的解决方案如下:
...
createSearchChoice:function(term, data) {
if ($(data).filter(function() {
return this.text.localeCompare(term) === 0;
}).length === 0) {
return {id:term, text: term, isNew: true};
}
},
formatResult: function (result, container, query, escapeMarkup) {
var markup=[];
window.Select2.util.markMatch(this.text(result), query.term, markup, escapeMarkup);
var text = markup.join("");
if (result.isNew) {
text = '<span class="label label-important">NEW</span> ' + text;
}
return text;
},
...