如何从 select2 multiselect 的选项列表中删除选定的选项并按选定的顺序显示选定的选项

How to remove selected option from the option list in select2 multiselect and show selected options in the order they are selected

我的表单中有 select2 个多 select 字段,我想在 selected 之后从下拉列表中删除 selected 选项,并且如果它已从列表中删除,请再次将其添加到列表中。此外,添加的项目应与 selected 的顺序相同。当前的 select2 (4.0) 没有删除 selected 项目,而是按照它们在下拉列表中出现的顺序显示 selected 项目,而不是在他们是 selected.

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

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

我找到了一种方法,使所选值不再出现在选择弹出列表中

在文档中你可以找到事件列表 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();
    }

  });

});

这是一个DEMO

希望对您有所帮助。

问题的第 1 部分:

您可以使用 CSS 技巧 来隐藏 selected item,如下所示:

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

问题的第 2 部分:

您还可以使用 JQuery 技巧 强制 selected items 到标签框的末尾,( 通过获取 select在 select 上编辑项目,将其分离(删除),然后将其重新添加到标签框,然后调用 "change function" 应用更改):

$("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"); 
});

Updated Fiddle #2

我的解决方案修改了第 #3158 行中的 select2.js(核心,版本 4.0.3)。添加以下验证:

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
    });
  };
$("#cqte").select2("val", "");
//cqte is id of dropdown 
$(document).ready(function(){
  $('#dynamicAttributes').select2({
        allowClear: true,
        minimumResultsForSearch: -1,
        width: 600
  });
});

点击删除标志按钮时出现错误

TypeError: this.placeholder is undefined

使用

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

      });
});

隐藏所选值的另一种方法是在值标记为已选时使用 dropdown 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>

从 select2 多个选定项目中删除(取消选择)项目

第一步:将 'multiple' css class 添加到您的 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');
    });

如果您有更改触发器或取消选择,请单击 使用这个:

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

其他

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

如果你想完全清空列表 使用

$("#dynamicAttributes").empty()

编码愉快