Подтвердить что ты не робот

Select2: Скрыть некоторые параметры динамически

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

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

Если бы можно было сделать что-то наподобие того, чтобы select выбрал какое-то конкретное отображение между исходным элементом <option> и копией select2 этого элемента, это также сработало бы. В качестве примера, скажем, "если исходный <option> имеет такой класс или имеет такой атрибут, результирующий элемент в выпадающем списке select будет создан таким образом".

4b9b3361

Ответ 1

Будет ли добавлено следующее правило CSS на страницу решить вашу проблему?

.select2-container--default .select2-results__option[aria-disabled=true] {
    display: none;
}

В основном это скроет параметр отключения, а не отобразит его с серым фоном.

Используйте disabled вместо display:'none' в вашем списке опций.

JS Bin

Ответ 2

Если вы хотите его достичь, возможно, вы можете изменить код select2.js,

Сначала я скрыл второй вариант, изначально он не будет работать, если вы используете

select2 плагин,

<select id="test" style="width:100px">
  <option></option>
  <option value='1'>1</option>
  <option value='2' style="display:none">2</option>
</select>

Вторые меня изменят код select2.js: строка 926

я добавлю условие условия && element.css('display') != 'none' здесь

 process = function (element, collection) {
     var group;
     if (element.is("option") && element.css('display') != 'none') {
         if (query.matcher(term, element.text(), element)) {
              collection.push(self.optionToData(element));
              }
     } else if (element.is("optgroup")) {
              group = self.optionToData(element);
              element.children().each(function (i, elm) { 
                       process(elm, group.children); 
                   });
              if (group.children.length > 0) {
                       collection.push(group);
              }
      }
     };

JSBIN http://jsbin.com/qusimi/1/edit

Ответ 3

$('.selector').remove(); 

Затем добавьте параметр в соответствии с положением, которое оно отображается в select2:

Чтобы отобразиться как первый вариант, выполните следующие действия:

$('.selector')
.prepend('<option value="option-value" class="option-value">Option Label</option>');

Чтобы отобразиться как последний вариант, выполните следующие действия:

$('.selector')
.append('<option value="option-value" class="option-value">Option Label</option>');

Появится как после любого из следующих вариантов:

$('<option value="option-value" class="option-class">Option Label</option>')
.insertAfter($('.selector option:first-child'));

или

$('<option value="option-value" class="option-value">Option Label</option>')
.insertAfter($('.selector > .option-class'));

ИЛИ

Мы можем отключить/включить параметр, используя jquery вместо того, чтобы скрываться.

$('.selector').prop('disabled', 'disabled');

$('.selector')
.prop('disabled', !$('.selector').prop('disabled'));

Ответ 4

У меня было аналогичное требование. Скрытие было предпочтительным, но многие из этих ответов были неопределенными для нескольких браузеров или слишком сложными. Изменение кода select2 также не могло быть и речи.

Мое решение состояло в том, чтобы сохранить копию параметров для каждого выбора в памяти в виде массива. Когда я захотел "скрыть" вариант, я бы использовал jQuery remove(). Когда я хотел "показать", я бы добавил его к этим опциям выбора.

Не забудьте вызвать .trigger( "change" ) в выборе, если возможно, вы скрываете параметр, который может быть выбран в данный момент.

Ответ 5

Это небольшая вариация принятого ответа, на самом деле мне пришлось изменить принятый ответ, чтобы он работал, мне пришлось изменить имена классов, возможно, это потому, что разные версии библиотеки Select2

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

Ответ 6

Для select2 3.5 это работает для меня:

.select2-result.select2-result-unselectable.select2-disabled {
    display: none;
}

Ответ 7

Я просто потратил 3 часа и нашел для меня очень простое и понятное решение для динамического отображения/скрытия опций в контейнере select2.

Сначала я создаю select2 с этой опцией: {.. templateResult: resultState,..}

Затем я предоставляю этот обратный вызов для копирования всех классов из исходной опции в опцию select2 (я показываю/скрываю опции в зависимости от их классов)

    function resultState(data, container) {
    if(data.element) {
        $(container).addClass($(data.element).attr("class"));
    }
    return data.text;
}

В моем CSS я объявил эту строку:

.select2-container--default .select2-results__option.optInvisible {
display: none;}

Теперь я могу легко показать или скрыть любые параметры в контейнере select2 с помощью addClass ("optInvisible") или removeClass ("optInvisible")..

Пусть это кому-нибудь поможет;) Привет