Использование SELECT2 4.0.0 с бесконечными данными и фильтром

Я использую Select2 уже 2 года, и мне очень нравится все, что сделано разработчиками. однако версия 3.5.x имеет свои ограничения, поэтому я перехожу на версию 4.0, от которой у меня голова болит!

К вашему сведению, я использую Select2 с большой таблицей (> 10 000 записей), поэтому AJAX и бесконечные данные (страница установлена ​​​​на 50 элементов).

  1. В версии 3.5.2 я могу воспроизвести подчеркивание при поиске данных (используя formatSelection и query.term). Есть идеи, как это сделать с версией 4.0.0 (функция templateResult передает только result, а не query больше?

  2. В версии 3.x вы можете добавлять бесплатные записи, используя искомое значение, отсутствующее в списке (используя createSearchChoice). Версия 4.0 не имеет этой опции, есть идеи, как сделать это снова?

  3. Я пытаюсь заменить панель выбора панелью ввода (все еще используя раскрывающийся список выбора). Кажется, можно заставить адаптер, но я не смог найти, как это сделать.

  4. Мне нужно добавить либо строку (в строке 1), либо кнопку (плавающую вправо), чтобы добавить новый элемент (аналогично createTag, но для элемента). кто-то уже сделал?


person Frederic    schedule 10.03.2015    source источник


Ответы (2)


Я настоятельно рекомендую прочитать примечания к выпуску и объявление о выпуске 4.0 при переходе с Select2 3.5.2 на Select2 4.0.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). В версии 4.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
});
person Kevin Brown    schedule 12.03.2015
comment
Спасибо, Кевин, ценю ваши усилия (и время), потраченные на ответы на вопросы и кодирование одновременно. Однако для вопроса № 2 я хочу добавить не бесплатный «тег», а бесплатную запись в виде раскрывающегося списка. любая помощь ? Спасибо. - person Frederic; 12.03.2015
comment
В чем разница между бесплатным тегом и бесплатным входом? createTag такой же, как старый createSearchChoice. - person Kevin Brown; 12.03.2015
comment
Спасибо, Кевин. Подчеркнутое решение - это именно то, что мне нужно. - person DerVO; 27.05.2015
comment
Боже мой. Невероятно, как трудно мне было найти это. И поймите разделение, но это должно быть обязательно из коробки: | - person JGutierrezC; 09.10.2016

Простой способ подчеркнуть совпадающие результаты с помощью 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;
    }
})
person AlexPalla    schedule 25.04.2018