Элемент управления jQuery select2 - получить последний выбранный элемент

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

1) запретить автоматическую сортировку выбранных значений 2) получить значение последнего выбранного элемента и при желании удалить несовместимый элемент из списка

Для 1) я не мог понять, как запретить автоматическую сортировку (и «данные», и «значения» упорядочиваются после выполнения выбора) Для 2) я нигде не мог найти информацию о последнем выбранном элементе (я ожидал найти что-то в выборе переменная e события).

Мой код следующий:

    $("#PhaseFilterSelectedList").select2()
       .on("select2:select", function (e) {
           // removing option inconsistent with last selected item, if any
           var allData = $("#PhaseFilterSelectedList").select2("val");
           if (!allData || allData.length < 2)
               return;

           //alert("Value = " + $("#PhaseFilterSelectedList").select2("val").join(','));
           //alert("Data = " + $("#PhaseFilterSelectedList").select2("data")[0].id + " " + $("#PhaseFilterSelectedList").select2("data")[1].id);

           var lastItemId = allData.slice(-1)[0];
           var lastItemHalf = Math.floor((parseInt(lastItemId) + 1) / 2);
           var toRemove = jQuery.grep(allData, function (elem, index) {
               return elem != lastItemId && Math.floor((parseInt(elem) + 1) / 2) == lastItemHalf;
           });

           if (!toRemove || toRemove.length < 1)
               return;

           allData.splice($.inArray(toRemove[0], allData), 1);
           $("#PhaseFilterSelectedList").select2("val", allData);

       })

Удаление несовместимых элементов работает нормально, но у меня возникают проблемы с идентификацией последнего выбора, сделанного пользователем.

Любая идея, как я могу выполнить эту задачу? Спасибо.


person Alexei - check Codidact    schedule 18.05.2015    source источник


Ответы (2)


Эй, я могу немного опоздать с ответом на этот вопрос, но я нашел довольно простое решение. Вы правы, просматривая событие для последнего выбранного элемента. Это сработало для меня.

var $eventSelect = $('.select_field'); //select your select2 input
$eventSelect.on('select2:unselect', function(e) {
  console.log('unselect');
  console.log(e.params.data.id); //This will give you the id of the unselected attribute
  console.log(e.params.data.text); //This will give you the text of the unselected text
})
$eventSelect.on('select2:select', function(e) {
  console.log('select');
  console.log(e.params.data.id); //This will give you the id of the selected attribute
  console.log(e.params.data.text); //This will give you the text of the selected
})

person Oscar Vazquez    schedule 19.12.2015
comment
В то же время я пытаюсь использовать только Angular, но ответ очень ценится, так как мне также приходится управлять устаревшим кодом :) - person Alexei - check Codidact; 19.12.2015
comment
Круто, без проблем, чувак. Да, angular не очень хорошо работает с плагинами jquery, ха-ха - person Oscar Vazquez; 19.12.2015
comment
Это должно быть выбрано как лучший ответ! - person Brane; 25.12.2015

для второй части это может вам помочь:

$(this).val(); // references the select

вы можете отфильтровать его, чтобы получить все необходимые значения.

Пример находится в скрипке: http://jsfiddle.net/jEADR/1588/

person toniL    schedule 18.05.2015
comment
На самом деле мне нужно идентифицировать только что выбранный элемент. Например, из вашей скрипки: выбран Вайоминг, выбрана Алабама, выбран выбор автосортировки, а последним выбранным элементом является Вайоминг, а не Алабама. Поскольку я использую событие выбора, я ожидаю найти только что выбранный элемент где-то в информации о событии, но не могу найти информацию. Спасибо за быстрый ответ. - person Alexei - check Codidact; 19.05.2015
comment
Мне удалось сделать это, используя обходной путь: иметь дополнительный массив, содержащий предыдущий выбор, и вычислить разницу между текущим выбором и предыдущим выбором. Однако я бы ожидал, что только что выбранный элемент будет легче получить. - person Alexei - check Codidact; 20.05.2015