2015-09-29 4 views
0

У меня есть вопрос относительно select2. Возможно ли, что мы добавим «Выделить все» в раскрывающемся списке?Select2 выбрать все выпадающий вариант

Пример:

<select> 
    <option value='-1'>select all</option> 
    <option value='a'>A</option> 
    <option value='b'>B</option> 
    <option value='c'>C</option> 
</select> 

Когда я выбираю «выбрать все» поле будет отображать «выбрать все», но на фоне выбраны переменного тока .. это похоже на трюк .. надеюсь, что у вас есть решение для этого.

Благодаря

+0

Выберите 2 - это потрясающе, но у вас есть выбор использовать другой плагин, что-то вроде этого [one] (https://github.com/davidstutz/bootstrap-multiselect). – janmvtrinidad

+0

@janmvtrinidad спасибо за идею, но я уже начал использовать select2 .. некоторые из моих форм .. но у меня проблема, когда у нее более 10 опций. Вот почему мне нужно «выбрать все» с вашим примером .. :( – claire

+0

вы можете отключить другую опцию, когда вы выберете все, чтобы избежать переполнения дизайна. Что вы думаете? – janmvtrinidad

ответ

0

Основываясь на http://jsbin.com/seqonozasu/1/edit?html,js,output, вы можете сделать что-то вроде этого:

$.fn.select2.amd.require([ 
     'select2/utils', 
     'select2/dropdown', 
     'select2/dropdown/attachBody' 
    ], function (Utils, Dropdown, AttachBody) { 
     function SelectAll() { } 

     SelectAll.prototype.render = function (decorated) { 
      var $rendered = decorated.call(this); 
      var self = this; 

      var $selectAll = $(
       '<span class="select2-results__option select-all" aria-selected="false">Select All</span>'); 

      $rendered.find('.select2-dropdown .select2-results').append($selectAll); 

      $selectAll.on('click', function (e) { 
       var $results = $rendered.find('.select2-results__option[aria-selected=false]:not(.select-all)'); 

       // Get all results that aren't selected 
       $results.each(function() { 
        var $result = $(this); 

        // Get the data object for it 
        var data = $result.data('data'); 

        // Trigger the select event 
        self.trigger('select', { 
         data: data 
        }); 
       }); 

       self.trigger('close'); 
      }); 

      $selectAll.on('mouseenter', function (e) { 
       var selectedClass = 'select2-results__option--highlighted'; 
       var $results = $rendered.find('.select2-results__option[aria-selected=false]:not(.select-all)'); 

       // Get all results that aren't selected 
       $results.each(function() { 
        var $result = $(this); 

        //remove selected class 
        $result.removeClass(selectedClass); 
       }); 

       $(this).addClass(selectedClass); 
      }); 


      $selectAll.on('mouseleave', function (e) { 
       var selectedClass = 'select2-results__option--highlighted'; 

       $(this).removeClass(selectedClass); 
      }); 
      return $rendered; 
     }; 

     $("select").select2({ 
      placeholder: "Select a User", 
      allowClear: true, 
      dropdownAdapter: Utils.Decorate(
       Utils.Decorate(
       Dropdown, 
       AttachBody 
      ), 
       SelectAll 
      ) 
     }); 
    }); 

вместе с CSS:

span.select2-results__option.select-all { 
    display: block; 
} 

Это добавляет все выбранные элементы ввода ВЫБ.2.

Чтобы показать «выбрать все», а не текст элемента, когда вы Переберите список элементов на $selectAll.click(), добавьте их в массив, а не вызывая select событие, а затем вызвать select событие вне цикла, чтобы выбрать фиктивный элемент «выбрать все». (Я не пробовал этот бит, так что это может не сработать).

Смежные вопросы