11

我使用 Select2 已经 2 年了,我真的很喜欢所有的开发者。但是,3.5.x 版有他的限制,所以我要升级到 4.0 版,这让我很头疼!

为了您的记录,我使用 Select2 和大表(> 10.000 个条目),所以 AJAX 和无限数据(页面设置为 50 个项目)。

  1. 使用 3.5.2 版,我可以在搜索数据时重现下划线匹配(使用formatSelectionand query.term)。知道如何使用 4.0.0 版制作它(功能templateResult只通过resultquery不再通过?

  2. 使用 3.x 版,您可以使用搜索值不在列表中(使用createSearchChoice)添加免费条目。4.0版没有这个选项,知道如何重新制作吗?

  3. 我尝试用输入栏替换选择栏(仍然使用选择下拉菜单)。似乎可以强制适配器,但我无法找到如何。

  4. 我需要添加一行(在第 1 行)或一个按钮(浮动到右侧)以添加新项目(类似于createTag,但用于项目)。有人已经做到了吗?

4

2 回答 2

21

从 Select2 3.5.2 迁移到 Select2 4.0.0 时,我强烈建议您阅读发行说明4.0 发行公告。

使用 3.5.2 版,我可以在搜索数据时重现下划线匹配(使用 formatSelection 和 query.term).. 知道如何使用 v4.0.0 进行匹配(函数 templateResult 只传递“结果”而不是“查询” ?

这在 4.0 中被删除了,因为结果已经从查询中分离出来,所以继续传递信息是没有意义的。当然,这并不意味着您无法获取查询并存储它。您需要做的就是存储查询,类似以下的内容可能会起作用

var query = {};
var $element = $('#my-happy-select');

function markMatch (text, term) {
  // Find where the match is
  var match = text.toUpperCase().indexOf(term.toUpperCase());

  var $result = $('<span></span>');

  // If there is no match, move on
  if (match < 0) {
    return $result.text(text);
  }

  // Put in whatever text is before the match
  $result.text(text.substring(0, match));

  // Mark the match
  var $match = $('<span class="select2-rendered__match"></span>');
  $match.text(text.substring(match, match + term.length));

  // Append the matching text
  $result.append($match);

  // Put in whatever is after the match
  $result.append(text.substring(match + term.length));

  return $result;
}

$element.select2({
  templateResult: function (item) {
    // No need to template the searching text
    if (item.loading) {
      return item.text;
    }

    var term = query.term || '';
    var $result = markMatch(item.text, term);

    return $result;
  },
  language: {
    searching: function (params) {
      // Intercept the query as it is happening
      query = params;

      // Change this to be appropriate for your application
      return 'Searching…';
    }
  }
});

在 3.x 版中,您可以使用列表中没有的搜索值添加免费条目(使用 createSearchChoice)。V4.0没有这个选项,知道如何重新制作吗?

这仍然可以在 4.0 中使用tags选项(将其设置为true)来完成。如果要自定义标签,可以使用createTag(类似于createSearchChoice)。

var $element = $('#my-happy-select');

$element.select2({
  createTag: function (query) {
    return {
      id: query.term,
      text: query.term,
      tag: true
    }
  },
  tags: true
});
于 2015-03-12T19:06:11.543 回答
4

使用 select2 4.x 为匹配结果下划线的简单方法

$element.select2({

    escapeMarkup: function (markup) { return markup; }
    ,
     templateResult: function (result) {
        return result.htmlmatch ? result.htmlmatch : result.text;
     }
    ,
    matcher:function(params, data) {
        if ($.trim(params.term) === '') {
          return data;
        }
        if (typeof data.text === 'undefined') {
          return null;
        }

        var idx = data.text.toLowerCase().indexOf(params.term.toLowerCase());
        if (idx > -1) {
          var modifiedData = $.extend({
              'htmlmatch': data.text.replace(new RegExp( "(" + params.term + ")","gi") ,"<u>$1</u>")
          }, data, true);

          return modifiedData;
        }

        return null;
    }
})
于 2018-04-25T21:37:03.823 回答