Как удалить выбранный параметр из списка параметров в select2 multiselect и показать выбранные параметры в том порядке, в котором они выбраны

У меня есть поле множественного выбора select2 в моей форме, где я хочу удалить выбранный параметр из раскрывающегося списка после его выбора и снова добавить его в список, если он будет удален из списка. А также добавленные элементы должны быть в том же порядке, в котором они были выбраны. Текущий select2 (4.0) не удаляет выбранные элементы и показывает выбранные элементы в том порядке, в котором они отображаются в раскрывающемся списке, а не в том порядке, в котором они выбраны.

$(document).ready(function(){
    $('#dynamicAttributes').select2({
            allowClear: true,
            minimumResultsForSearch: -1,
            width: 600
     });
 });

JSFiddle: https://jsfiddle.net/rd62bhbm/


person user1614862    schedule 17.04.2016    source источник


Ответы (7)


Часть 1 вопроса:

Вы можете использовать трюк CSS, чтобы скрыть selected item следующим образом:

.select2-results__option[aria-selected=true] {
    display: none;
}

Часть 2 вопроса:

Также вы можете использовать трюк JQuery, чтобы принудительно selected items поставить в конец поля тегов, (получив выбранный элемент при выборе, отсоединить его (удалить), затем снова добавить его в поле тегов, затем вызвать "функция изменения" для применения изменений ):

$("select").on("select2:select", function (evt) {
    var element = evt.params.data.element;
    var $element = $(element);
    $element.detach();
    $(this).append($element);
    $(this).trigger("change");
});

Наконец-то обновлен JsFiddle, надеюсь, он вам поможет, спасибо!

Изменить №1

Вы можете Clear All Selected этим вызовом (применить нулевые значения):

$("#dynamicAttributes").val(null).trigger("change"); 

на кнопке:

$('#btnReset').click(function() {
    $("#dynamicAttributes").val(null).trigger("change"); 
});

Обновлен скрипт №2

person Shady Alset    schedule 18.04.2016
comment
Он просто очищает все выбранные значения из поля ввода, но не запускает событие отмены выбора .on('select2:unselect', function(e) {}. Это происходит, когда я на самом деле нажимаю кнопку x в поле ввода. Я хочу аналогичный поведение, когда я нажимаю кнопку сброса формы.Потому что у меня есть некоторый код для выполнения функции обратного вызова отмены выбора для каждого выбранного значения. - person user1614862; 18.04.2016
comment
@user1614862 user1614862 да, этот метод не вызывает событие отмены выбора. этот метод запуска официально используется в документации плагина › Программный доступ.. но я буду уведомлять вы, как только я нашел другой метод. Спасибо - person Shady Alset; 18.04.2016
comment
К сожалению, CSS-решение части № 1 плохо работает при просмотре параметров с помощью клавиатуры, потому что оно по-прежнему проходит через display: none. - person Koby; 24.04.2018
comment
Часть №1 мне достаточно :) спасибо - person Espresso; 05.04.2021

Я нахожу способ сделать так, чтобы выбранные значения больше не отображались во всплывающем списке выбора.

В документации вы можете указать список событий Select2 events

открыть

Я использую это событие select2, чтобы скрыть выбранные значения

Вот javascript::

$(document).ready(function() {

  $('#dynamicAttributes').select2({
      allowClear: true,
      minimumResultsForSearch: -1,
      width: 600
  });

  // override the select2 open event
  $('#dynamicAttributes').on('select2:open', function () {
    // get values of selected option
    var values = $(this).val();
    // get the pop up selection
    var pop_up_selection = $('.select2-results__options');

    if (values != null ) {
      // hide the selected values
       pop_up_selection.find("li[aria-selected=true]").hide();

    } else {
      // show all the selection values
      pop_up_selection.find("li[aria-selected=true]").show();
    }

  });

});

Вот ДЕМО

Надеюсь, поможет.

person Oli Soproni B.    schedule 18.04.2016

мое решение было изменено в select2.js (ядро, версия 4.0.3) в строке #3158. Добавьте следующую проверку:

if ($option[0].selected == true) {
      return;
}

С помощью этой проверки мы можем исключить из выпадающего списка выбранные. И если вы напишете название выбранной опции, появится текст опции «noResult».

Вот полный код:

SelectAdapter.prototype.query = function (params, callback) {
    var data = [];
    var self = this;

    var $options = this.$element.children();

    $options.each(function () {
      var $option = $(this);    
      if (!$option.is('option') && !$option.is('optgroup') ) {
        return;
      }

      if ($option[0].selected == true) {
           return;
      }

      var option = self.item($option);    
      var matches = self.matches(params, option);    
      if (matches !== null) {
        data.push(matches);
      }
    });

    callback({
      results: data
    });
  };
person Javier    schedule 11.08.2016

Другой способ скрыть выбранные значения — использовать параметр раскрывающегося списка templateResult для return null, когда значение отмечено как выбрано.

function hideSelected(value) {
  if (value && !value.selected) {
    return $('<span>' + value.text + '</span>');
  }
}

$(document).ready(function() {
  $('#dynamicAttributes').select2({
    allowClear: true,
    placeholder: {
      id: "",
      placeholder: "Leave blank to ..."
    },
    minimumResultsForSearch: -1,
    width: 600,
    templateResult: hideSelected,
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.2/css/select2.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.2/js/select2.min.js"></script>

<select id="dynamicAttributes" multiple="true" data-tags="true">
  <option value="1">A</option>
  <option value="2">B</option>
  <option value="3">C</option>
</select>

person Will B.    schedule 02.07.2019

$(document).ready(function(){
  $('#dynamicAttributes').select2({
        allowClear: true,
        minimumResultsForSearch: -1,
        width: 600
  });
});

это делает ошибку при нажатии кнопки удаления знака

TypeError: this.placeholder не определен

использовать

 $(document).ready(function(){
      $('#dynamicAttributes').select2({
            allowClear: true,
            minimumResultsForSearch: -1,
            width: 600,
            placeholder: 'past your placeholder'

      });
});
person Avat Rezaei    schedule 04.10.2018

Удалить (UnSelect) элемент из select2 нескольких выбранных элементов

первый шаг: добавьте «множественный» класс css к вашему элементу select2, чтобы получить истинный элемент, который вы хотите

<select class="multiple">
....
</select>

    $('select.multiple').on('select2:selecting', function (e) {
        var select = this;
        var idToRemove = '0';
        var selections = $(select).select2('data');

        var Values = new Array();

        for (var i = 0; i < selections.length; i++) {
            if (idToRemove !== selections[i].id) {
                Values.push(selections[i].id);
            }
        }
        $(select).val(Values).trigger('change');
    });
person amir taghavi    schedule 07.10.2019

Если у вас есть триггер изменения или отмена выбора, используйте это:

$("#dynamicAttributes").val(null).trigger("change");

еще

$("#dynamicAttributes").val('')

Если вы хотите полностью очистить список, используйте

$("#dynamicAttributes").empty()

Удачного программирования

person Deepa Rokhade    schedule 17.02.2021