【问题标题】:Bootstrap-select with selected on top and jQuery sortable integrationBootstrap-select 顶部选择和 jQuery 可排序集成
【发布时间】:2016-08-15 15:45:28
【问题描述】:

我在一个项目中使用Bootstrap-Select,但multiple 列表存在问题。我的应用程序必须满足以下要求。

更新:

基于@caseyjhol 很好的答案,我开始尝试实现这一点,here 是一个 JSFiddle。

要求:

1) 我需要将所选项目呈现在列表顶部,而不是在其原始位置。这是因为如果我有一个大列表,我不希望用户必须向下滚动所有列表来检查那些有勾号的项目。因此,我将所有选中的内容呈现在顶部,然后是分隔线,然后是未选中的。

假设原始列表按此顺序为A B C D E F。所以..如果我点击C,列表应该变成C A B C D E F。如果我然后单击E,它应该变成C E A B D F

这部分要求确实有效。

2) 但是,如果我现在再次取消选择(单击)E,那么列表应该变为C A B D E F。这部分不起作用,我不知道该怎么做。

3) 从所选项目(位于顶部的项目)中,我希望允许使用jQueryUI sortable 通过拖放对它们进行排序。这样,用户不仅可以选择哪些选项,还可以选择顺序。

例如,假设我点击了C,然后点击了E,列表现在为C E A B D F。从这里开始,我应该被允许只对C E 部分进行排序。现在,假设我将C 拖放到E 之后。 Bootstrap <ul> 正确显示为 E C A B D F (这是我需要的)。但是现在,当我提交表单时,html列表仍然有旧订单C E A B D F。所以我仍然无法将<ul> 的状态应用到 html 选择中。

我尝试尽可能多地记录我的要求。任何帮助表示赞赏。

提前致谢

【问题讨论】:

  • 请向我们展示您目前拥有的东西。
  • 好的,希望现在好多了,我更新了很多问题。

标签: javascript jquery twitter-bootstrap jquery-ui bootstrap-select


【解决方案1】:

每个li 元素都有一个data-original-index 属性。这会告诉您原始 select 元素中的选项索引。我不确定您的确切用例是什么。如果您只是尝试对选项进行排序以使所选选项位于顶部,我认为对选择本身执行排序然后使用.selectpicker('refresh') 更新引导选择更有意义。如果出于某种原因您需要对 li 元素执行排序,我会这样做:

$(window).on('load', function() {
  var $menu = $('#myList').data('selectpicker').$menu,
      $options = $('#myList').find('option');

  function updateOptions() {
    var optionArray = [];

    $menu.find('li').each(function(i, el) {
      optionArray.push($options.eq($(el).data('originalIndex')));
    });
    
    $('#myList').append(optionArray);
    
    // for displaying current order of options
    $('#myList').trigger('showOptions');
  }
  
  // for displaying current order of options
  $('#myList').on('loaded.bs.select showOptions', function() {
    $('#options').empty();
    
    var arr = [];

    $(this).find('option').each(function() {
      arr.push($(this).val());
    });
    
    $('#options').append(arr.join(', '));
  });
  
  setTimeout(function() {
    // move the first li to the end of the list
    $menu.find('li').eq(0).appendTo($menu.find('ul'));

    // for displaying current order of options
    $('#myList').trigger('showOptions');
    
    // update the order of the options to match the list
    updateOptions();
  }, 500);
});
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<link href="https://rawgit.com/silviomoreto/bootstrap-select/master/dist/css/bootstrap-select.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script src="https://rawgit.com/silviomoreto/bootstrap-select/master/dist/js/bootstrap-select.js"></script>

<select id="myList" class="selectpicker" multiple>
    <option value="Aberdare">Aberdare</option>
    <option value="Berdeen">Berdeen</option>
    <option value="Crington">Crington</option>
</select>

<div id="options"></div>

您需要在生产中做一些不同的事情(例如确保正确更新 originalIndex),但这应该为您指明正确的方向。

【讨论】:

  • 嗨@caseyjhol。我准备了一个带有确切问题的 JSFiddle:jsfiddle.net/L7wzv5k0/4 试图实现您的解决方案。我肯定做错了什么。我将很快更新问题。谢谢!
  • 嗨@caseyjhol 感谢您的出色回答。它让我开始设计解决方案的原型。尚未完全工作,但这是一个开始。我创建了一个 JSFiddle 并更新了很多问题。希望你能再次帮助我;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 2011-03-24
  • 2018-03-02
  • 1970-01-01
相关资源
最近更新 更多