简体   繁体   English

如何使用bootstrap-multiselect动态隐藏/显示选项?

[英]How can I hide/show options on the fly with bootstrap-multiselect?

I am using bootstrap-multiselect to give the user great controller over two key menus. 我正在使用bootstrap-multiselect为用户提供超过两个关键菜单的优秀控制器。 My first menu is called groups and other called queues . 我的第一个菜单叫做groups和其他叫做queues Each option in the queues has an HTML5 data attribute (ie data-group="X", where X is a group-value) 队列中的每个选项都有一个HTML5数据属性(即data-group =“X”,其中X是一个组值)

When the user selects a option/group from the groups menu, I want to find and hide every queue/option in the queues menu where data-group is not equal to a selected group in the groups menu. 当用户从groups菜单中选择选项/组时,我想查找并隐藏queues菜单中的每个队列/选项,其中data-group不等于组菜单中的选定组。

After identifying the queues/items that needs to be hidden/showing, I tried to use .show() and .hide() extensions. 在确定需要隐藏/显示的队列/项目之后,我尝试使用.show().show() .hide()扩展。 Then I tried to use .addClass('hidden') and .removeClass('hidden') methods, but nothing is working for me. 然后我尝试使用.addClass('hidden').removeClass('hidden')方法,但没有什么对我.addClass('hidden')

How can I show/hide items on the fly with bootstrap-multiselect ? 如何使用bootstrap-multiselect动态显示/隐藏项目?

Here is my code 这是我的代码

$(function () {
    var queueGroupIds = $('#QueueGroupIds');
    var queueIds = $('#QueueIds');

    queueGroupIds.multiselect({
        nonSelectedText: 'Select group(s)',
        onChange: function (option, checked, select) {
            var groups = queueGroupIds.find('option:selected');

            if (groups.length == 0) {
                //When none of the groups are selected, show all queues!
                queueIds.find('option').each(function (i, q) {
                    $(q).show();
                });
            }

            var queueToDeselect = [];

            //loop over every select option "if any are selected"
            groups.each(function (index, grp) {
                var group = $(grp);

                // loop over every queue option
                queueIds.find('option').each(function (i, q) {
                    var queue = $(q);

                    //id the data-group value == selected group show the item
                    if (queue.data('group') == group.val()) {
                        queue.show();

                        //this prints the value which should be showing
                        console.log('showing', queue.val());
                    } else {
                        queueToDeselect.push(queue.val());
                        queue.hide();

                        //this prints the value which should be hidden
                        console.log('hidding', queue.val());
                    }
                });

            });

            //Delected all hidden queues
            queueIds.multiselect('deselect', queueToDeselect);
            queueIds.multiselect('refresh');
        }
    });

    queueIds.multiselect({
        nonSelectedText: 'Select queue(s)'
    });
});

Edited for default none selected: Example shown in the following fiddler (I've trimmed it down to a base example for clarity): https://jsfiddle.net/m6uuL53w/3/ 编辑为默认无选择:以下提琴手中显示的示例(为了清楚起见,我将其修剪为基础示例): https//jsfiddle.net/m6uuL53w/3/

No need for any manual messy DOM ADD/REMOVE manipulation. 无需任何手动凌乱的DOM ADD / REMOVE操作。 Multiselect will carry over the disabled class you put on your raw list so you just need target it with css after you set the disabled values and refresh your list. Multiselect将继承您放在原始列表中的禁用类,因此您只需在设置禁用值并刷新列表后使用css将其作为目标。 Let multiselect worry about dom manipulation. 让多选担心dom操纵。

Example HTML: 示例HTML:

<select id="one" multiple="multiple">
    <option value="1">One</option>
    <option value="2">Two</option>
    <option value="3">Three</option>
</select>

<select id="two" multiple="multiple">
    <option data-group="1" value="OneA" disabled >One A</option>
    <option data-group="1" value="OneB" disabled>One B</option>
    <option data-group="2" value="TwoA" disabled>Two A</option>
    <option data-group="2" value="TwoB" disabled>Two B</option>
    <option data-group="3" value="ThreeA" disabled >Three A</option>
</select>

Jquery: jQuery的:

$(document).ready(function() {
    $('#one').multiselect({
        onChange: function(element, checked) {
        var opts = $('*[data-group="'+ element.val() +'"]');
            if (checked === true) {
                opts.prop('disabled', false).prop('selected', false);
            }
            else if (checked === false) {
                opts.prop('disabled', true).prop('selected', false);
            }
            $("#two").multiselect('refresh');
        }
    });
    $('#two').multiselect();
});

Just a pinch of CSS: 只是一小撮CSS:

.multiselect-container > li.disabled { display:none;}

https://jsfiddle.net/ta1wvs3j/1/ https://jsfiddle.net/ta1wvs3j/1/

    //Because we alter the DOM, we need to save an instance of the original list
    //There are many ways to do this, I chose an easy one
    var globalClone = $('#queues option');

    //Init the queues
    $('#queues').multiselect({
      nonSelectedText: 'Select queue(s)',
      onChange: function (option, checked, select) {
      }
    });
    //Init the groups
    $('#groups').multiselect({
        nonSelectedText: 'Select group(s)',
        onChange: function (option, checked, select) {
            //Store the list of selections in an array
            var selections = $('#groups').val();
            //Reset the queue to it's starting list so we can loop
            $('#queues').html(globalClone);
            //Look at each option
            $('#queues option').each(function(){
                //"includes" may not be widly suppoerted but there are other ways to see if a value is in an array
                //Check to see if the data-group value is in the selections array, if it's not
                if( selections.includes(String($(this).data('group'))) == false ){
                    //Remove the option from the DOM
                    $(this).remove();
                 }
             });
             //Rebuild, per the multiselect docs basically reinit the select. Nice we don't have to destroy and recreate. 
             $('#queues').multiselect('rebuild');
          }
      });

This isn't how I'd leave production code exactly but it shows you how it can work. 这不是我如何准确地保留生产代码,但它向您展示了它是如何工作的。

Basically, loop, check, alter DOM, and rebuild multiselect. 基本上,循环,检查,更改DOM和重建多选。 I think this is what you want. 我想这就是你想要的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM