流程上的引导多选更新选项列表

Posted

技术标签:

【中文标题】流程上的引导多选更新选项列表【英文标题】:Bootstrap Multiselect update option list on flow 【发布时间】:2013-12-22 11:51:33 【问题描述】:

我使用引导程序multi-select,我想使用 ajax 更新流选项

在初始化时填充我的多选

<select name="model" class="multiselect" multiple="multiple">
                <? foreach ($sel_models as $mod)  ?>
                    <option value="<?= $mod ?>" <?= ($mod == $params['model']) ? 'selected' : '' ?>><?= $mod ?></option>
                <?  ?>    
</select>  

然后在事件中我想用以下 ajax 更新我的选项列表

我尝试使用重建方法,但创建后不会触发下拉菜单

 $.ajax(
        type: 'post',
        url: "helper/ajax_search.php",
        data: models: decodeURIComponent(brands),
        dataType: 'json',
        success: function(data) 
            $('select.multiselect').empty();
            $('select.multiselect').append(
                    $('<option></option>')
                    .text('alle')
                    .val('alle')
                    );

            $.each(data, function(index, html) 
                $('select.multiselect').append(
                        $('<option></option>')
                        .text(html.name)
                        .val(html.name)
                        );
            );

            $('.multiselect').multiselect('rebuild')
        ,
        error: function(error) 
            console.log("Error:");
            console.log(error);
        
    );

使用 firebug 我可以看到列表已生成,但在选择时不会显示

【问题讨论】:

如果您刚刚使用 ajax 更改了选择框选项,则需要调用 $('.multiselect').multiselect('rebuild') 。它将使用选择框中的选定值再次重建。 【参考方案1】:

在我可以阅读的文档中:

.multiselect('setOptions', 选项) 用于在初始化多选后更改配置。这可能与 .multiselect('rebuild') 结合使用。

也许您无法通过最初的方式更改小部件数据。您应该以正确的方式使用setOptions 方法。

否则:按照您的方式,也许您应该考虑销毁您的小部件.multiselect('destroy') 并在之后重新创建它。

评论后更新:

在文档中:(您已链接)

通过以下方式为构建选择的选项提供数据:

var data = [
    label: "ACNP", value: "ACNP",
    label: "test", value: "test"
];
$("#multiselect").multiselect('dataprovider', data);

所以: 当您从 ajax 调用中获取数据时,您必须创建一个对象数组(这是您想要拥有的选择中的选项),其格式类似于

var data = 
[
    label: 'option1Label', value: 'option1Value',
    label: 'option2Label', value: 'option2Value',
    ...
]

当你的对象数组被创建后,你只需要调用方法

$("#multiselect").multiselect('dataprovider', data);

其中 data 是您的对象数组。

我希望我很清楚:/

【讨论】:

感谢您的反馈!我刚刚在阅读,但说实话我不知道我应该如何使用它 如果我使用 dataprovider,如何传递其他条件,如按钮宽度、最大高度等? 你知道如何在这个数组中包含部分 我使用 jquery 附加了选项,然后使用了 .multiselect('rebuild')。它奏效了【参考方案2】:

作为 multiselect('dataprovider', data) 的替代方法,您可以完全按照您在问题中所做的方式使用 jquery append 构建列表。您需要做的唯一更改是将重建延迟到 ajax 请求完成之后。

var buildDrivers = $.getJSON('resources/orders/drivers.json', function(data)  
   $.each(data, function(i, driver) 
      $('#toolbar select[name="drivers"]').append('<option>'+driver+'</option>');
   );
);
buildDrivers.complete(function() 
    $('.multiselect').multiselect('rebuild');
);

请参阅 http://api.jquery.com/jquery.getjson/ 获取文档

【讨论】:

【参考方案3】:

我添加了过滤后更新选项的功能,并从服务器端获取它们。该解决方案基于注入新选项、销毁选择并再次初始化它的概念。

我考虑到了:

    考虑到必须保留的现有选定选项。 删除重复选项(可能是已经选择的选项与来自服务器的新选项的冲突)。 更新后保持选项托盘打开。 重新分配搜索文本框中的前一个文本并将其聚焦。

只需将 'updateOptions' 作为函数添加到 'refresh' 函数之后,以及两个辅助函数,如下所示:

updateOptions: function (options) 
        var select = this.$select;
        options += this.getSelectedOptionsString();
        var selectedIds = select.val(),
            btnGroup = select.next('.btn-group'),
            searchInput = btnGroup.find('.multiselect-search'),
            inputVal = searchInput.val();

        options = this.removeOptionsDuplications(options);
        if (!options) 
            options = '<option disabled></option>';
        

        // 1) Replacing the options with new & already selected options
        select.html(options);

        // 2) Destroyng the select
        select.multiselect('destroy');

        // 3) Reselecting the previously selected values
        if (selectedIds) 
            select.val(selectedIds);
        

        // 4) Initialize the select again after destroying it
        select.multiselect(this.options);

        btnGroup = select.next('.btn-group');
        searchInput = btnGroup.find('.multiselect-search');

        // 5) Keep the tray options open
        btnGroup.addClass('open');

        // 6) Setting the search input again & focusing it
        searchInput.val(inputVal);
        searchInput.focus();
    ,
    getSelectedOptionsString: function ()  // Helper
        var result = '',
            select = this.$select,
            options = select.find('option:selected');

        if (options && options.length) 
            $.each(options, function (index, value) 
                if (value) 
                    result += value.outerHTML;
                
            );
        

        return result;
    ,
    removeOptionsDuplications: function (options)  // Helper
        var result = '',
            ids = new Object();

        if (options && options.length) 
            options = $(options);
            $.each(options, function (index, value) 
                var option = $(value),
                    optionId = option.attr('value');

                if (optionId) 
                    if (!ids[optionId]) 
                        result += option[0].outerHTML;
                        ids[optionId] = true;
                    
                
            );
        
        return result;
    ,

演示:

状态:

“选项 1”

$('#select').multiselect('updateOptions', '<option value="2">Option 2</option>');

状态:

“选项 2”

“选项 1”

【讨论】:

【参考方案4】:

我认为这是一种更简单的方法,可以将选项(使用 ajax 或任何其他侦听器)动态添加到现有的 Bootstrap MultiSelect。

以下是添加选项的简化示例:

function addOptionToMultiSelect(multiselectSelector, value, selected) 
    var data = [];
    $(multiselectSelector + ' option').each(function()
        var value = $(this)[0].value;
        var selected = $(this)[0].selected;
        data.push(label: value, value: value, selected: selected);
    );

    // Add the new item
    data.push(label: value, value: value, selected: selected);

    $(multiselectSelector).multiselect('dataprovider', data);

为简单起见,我假设选项中的标签和值都相同。请注意,通过从现有选项中读取 selected 属性来处理已选择的选项。您可以通过跟踪 disabled 和其他属性使其更加复杂。

示例:

addOptionToMultiSelect('#multiselect-example', 'new-option', true);

【讨论】:

以上是关于流程上的引导多选更新选项列表的主要内容,如果未能解决你的问题,请参考以下文章

引导多选下拉菜单从 optgroup 中取消选择相同的值选项

引导多选列表不会为 Rails 打开

RobotFramework Selenium:如何从多选下拉列表中选择多个选项?

如何维护引导选项卡上的分页?

vue table中使用多选的问题(翻页后如何保存已选项),联动echarts图表实现流量监控

如何使用 Selenium-Python 从多选列表中选择多个选项?