在select2中标记新标签?

时间:2013-02-04 04:38:18

标签: javascript jquery jquery-select2

我正在使用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;
                }
            })
        }
    })

现在这很棒

Marked as new tag

除非我为标签输入的内容作为该标签的标记的一部分存在 Error marked as new tag

根据我收集的内容,我需要覆盖formatResultformatSelectionmatcher

这是我从文档中得到的,但我不明白我需要如何改变它。

3 个答案:

答案 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;
},
...