select2:禁用区分大小写的匹配项

时间:2015-06-19 17:45:55

标签: javascript jquery-select2

我试图在select2库中只允许一个值,无论它是如何编写的。例如,如果值“Test”在数据列表中,则不应再次添加“test”。我已经搜索了一段时间,并查看了文档,但我没有解决这个问题。

        $("#timezones").select2({
            tags: true,
            createTag: function (tag) {
                return {
                    id: tag.term,
                    text: tag.term + " (new)",
                    isNew: true
                };
            },
            matcher: function (term, data) {
                // `term.term` should be the term that is used for searching
                // `data.text` is the text that is displayed for the data object
                if ($.trim(term.term) === '') {
                    return data;
                }

                var termString = term.term.trim();
                var textString = data.text.trim();
                var termStringUpper;
                var textStringUpper;

                if (termString) termStringUpper = termString.toUpperCase();
                if (textString) textStringUpper = textString.toUpperCase();

                return termStringUpper == textStringUpper;
            }
        });

这是一个JSFiddle:https://jsfiddle.net/2sz0oj8m/

2 个答案:

答案 0 :(得分:4)

问题是,当您应该使用matcher方法运行时,您正在运行createTag方法中的所有比较:

  • 默认情况下,matcher不区分大小写,您无需为此运行任何特殊代码。请注意,如果删除该函数并键入“test”,则建议将包括“Test”(即使您使用小写t编写它也会使用大写字母T)。

  • createTag指定将建议新标记创建的操作。 会在文本框中的每次更改as specified here)时执行,而不是在没有匹配时执行。

所以解决方案是:

  1. 删除matcher方法。
  2. 将案例比较添加到createTag方法。
  3. 如果未找到不区分大小写的匹配项,则仅返回新建议。
  4. 结果如下:

    $("#timezones").select2({
        tags: true,
        createTag: function (tag) {
    
            // Check if the option is already there
            var found = false;
            $("#timezones option").each(function() {
                if ($.trim(tag.term).toUpperCase() === $.trim($(this).text()).toUpperCase()) {
                    found = true;
                }
            });
    
            // Show the suggestion only if a match was not found
            if (!found) {
                return {
                    id: tag.term,
                    text: tag.term + " (new)",
                    isNew: true
                };
            }
        }
    });
    

    你可以看到它在你的JSFiddle的这个更新上运行:https://jsfiddle.net/2sz0oj8m/1/(输入“test”,你会看到该建议没有显示给那个特定的值)。

    编辑:此解决方案与远程数据源不兼容,您可能希望存储最后的值,或者如果标记存在则直接签入ajax结果。

答案 1 :(得分:0)

对于远程数据源和tags:true,我执行了以下代码:

$('selector').select2({
    tags: true,
    createTag: function ($params) {
        var $term = $.trim($params.term);
        if ($term === '') {
          return null;
        }

        return {
          id: $term,
          text: $term,
          newTag: true // add additional parameters
        }
    },
    insertTag: function(data, tag) {
        var $found = false;
        $.each(data, function(index, value) {
            if($.trim(tag.text).toUpperCase() == $.trim(value.text).toUpperCase()) {
                $found = true;
            }
        });

        if(!$found) data.unshift(tag);
    },
    // .. other select2 options include remote options 
});

  • 注意:上面的代码适用于Select2 4.0.x