【问题标题】:How to use dynamic select on Select2?如何在 Select2 上使用动态选择?
【发布时间】:2018-08-10 11:50:26
【问题描述】:

我想根据第一个 select 使用 Select2 选择分组的国家/地区。我正在尝试使用基本的Select2 代码,但是带有data-group 的第二个select 无法正常工作。

我的问题是:

更改第一个select(大陆)选项,然后移动到第二个(国家)并选择一个国家,现在回到大陆并更改为另一个。转到第二个并选择另一个国家,它不会选择。

示例:选择欧洲 > 选择意大利 > 选择美国 > 选择阿根廷 > 再次选择欧洲 > 选择任何国家 > 阿根廷将保留为所选国家。

这是一个小视频,展示了正在发生的问题:Youtube Link

我还在 sn-p 上附加了我的工作代码。

$(document).ready(function() {
    $('.js-example-basic-single').select2();
});

$(function(){
    $('#groups').on('change', function(){
        var val = $(this).val();
        var sub = $('#sub_groups');
        $('option', sub).filter(function(){
            if (
                 $(this).attr('data-group') === val 
              || $(this).attr('data-group') === 'SHOW'
            ) {
              if ($(this).parent('span').length) {
                $(this).unwrap();
              }
            } else {
              if (!$(this).parent('span').length) {
                $(this).wrap( "<span>" ).parent().hide();
              }
            }
        });
    });
    $('#groups').trigger('change');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet"/>
<select class="js-example-basic-single" id="groups" style="width:50%;">
    <option value='America'>America</option>
    <option value='Europe'>Europe</option>
    <option value='Asia'>Asia</option>
<select>
    
<select class="js-example-basic-single" id="sub_groups" style="width:50%;">
    <option data-group='SHOW' value='0'>-- Select --</option>
    <option data-group='America' value='Argentina'>Argentina</option>
    <option data-group='America' value='Brazil'>Brazil</option>
    <option data-group='America' value='Chile'>Chile</option>
    <option data-group='Europe' value='Italy'>Italy</option>
    <option data-group='Europe' value='France'>France</option>
    <option data-group='Europe' value='Spain'>Spain</option>
    <option data-group='Asia' value='China'>China</option>
    <option data-group='Asia' value='Japan'>Japan</option>
<select>

这个问题有什么解决办法吗?

【问题讨论】:

  • 抱歉,我看不出有什么问题,我错过了什么?你到底有什么问题?
  • 在 sn-p @CalvinNunes 上运行我的代码后,您是否尝试过该代码?在第一次选择后,移动到另一个大陆(即从美国到欧洲),国家/第二个选项将无法正常工作。
  • 我已经编辑了我的问题 (y)
  • 我选择“亚洲”,然后第二个选项显示我:中国和日本。我选择“美国”,然后第二个选项显示:阿根廷、巴西、智利。这里有什么问题? (编辑后测试)
  • 好的,现在我明白了这个问题,但还没有找到解决方案(我编辑了你的问题,让它更清楚地理解)也许有人现在可以提供帮助

标签: javascript jquery html jquery-select2


【解决方案1】:

groups 更改时将 sub_groups' 值重置为 0。

$('#groups').on('change', function(){
  var val = $(this).val();
  var sub = $('#sub_groups');
  sub.val(0);
  ...
});

另外,您的 HTML 中的 select 标记未正确关闭。

$(document).ready(function() {
  $('.js-example-basic-single').select2();
});

$(function() {
  $('#groups').on('change', function() {
    var val = $(this).val();
    var sub = $('#sub_groups');
    sub.val(0);
    $('option', sub).filter(function() {
      if ($(this).attr('data-group') === val ||
          $(this).attr('data-group') === 'SHOW') {
        if ($(this).parent('span').length) {
          $(this).unwrap();
        }
      } else {
        if (!$(this).parent('span').length) {
          $(this).wrap("<span>").parent().hide();
        }
      }
    });
  });
  $('#groups').trigger('change');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet" />

<select class="js-example-basic-single" id="groups" style="width:50%;">
  <option value='America'>America</option>
  <option value='Europe'>Europe</option>
  <option value='Asia'>Asia</option>
</select>

<select class="js-example-basic-single" id="sub_groups" style="width:50%;">
  <option data-group='SHOW' value='0'>-- Select --</option>
  <option data-group='America' value='Argentina'>Argentina</option>
  <option data-group='America' value='Brazil'>Brazil</option>
  <option data-group='America' value='Chile'>Chile</option>
  <option data-group='Europe' value='Italy'>Italy</option>
  <option data-group='Europe' value='France'>France</option>
  <option data-group='Europe' value='Spain'>Spain</option>
  <option data-group='Asia' value='China'>China</option>
  <option data-group='Asia' value='Japan'>Japan</option>
</select>

【讨论】:

  • 这是一个绝妙的主意,但如果我添加默认选择的值将不起作用。
  • 为什么不呢?
  • 例如:&lt;option data-group='America' value='Brazil' selected&gt;Brazil&lt;/option&gt; 默认选择不在那里显示。
  • 如果要默认选择巴西,在$('#groups').trigger('change');后面加$('#sub_groups').val('Brazil');即可。
  • 哇……太神奇了。 100% 工作。谢谢@Joseph Webber,您节省了我的时间 :) 我也已经将您的回答标记为已接受 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
  • 1970-01-01
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多