You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Laravel+Bootstrap实现带动态数据库值的Input Spinner

解决方案:整合动态无规律数值到Bootstrap Input Spinner

核心思路

由于你的数值是无规律离散值(125、180、200等),Bootstrap Input Spinner默认的固定step增减逻辑不适用,需要通过以下方式实现需求:

  • 将数据库中的数值同步到前端JS数组,作为可选值集合
  • 重写Spinner的增减行为,让它在预设数值列表中切换
  • 实现下拉框与Spinner的双向同步

具体实现步骤

1. 传递数据库数值到前端JS

在Laravel视图中,将$facebook集合中的amount字段转为有序JS数组:

<script>
// 从Laravel集合提取数值并转为排序后的JS数组
const facebookAmounts = @json($facebook->sortBy('amount')->pluck('amount')->toArray());
</script>

2. 修改HTML结构

保留原有下拉框,为Spinner添加ID方便JS操作:

<select class="form-select form-select-lg srd" id="facebookpack" aria-label="Default select example">
    <option selected value="">Select package</option>
    @foreach ($facebook as $item)
        <option value="{{ $item->amount }}">{{ $item->amount }}</option>
    @endforeach
</select>

<!-- Input Spinner 输入框 -->
<input type="number" id="facebookSpinner" value="" placeholder="Select a package">

3. 编写JS逻辑实现交互

初始化Spinner并自定义增减、同步逻辑:

$(document).ready(function() {
    // 初始化Bootstrap Input Spinner
    const $spinner = $("#facebookSpinner").inputSpinner({
        decrementButton: "<strong>-</strong>",
        incrementButton: "<strong>+</strong>",
        step: 1, // 临时设置,后续重写逻辑覆盖
        min: Math.min(...facebookAmounts),
        max: Math.max(...facebookAmounts)
    });

    // 下拉框切换时,同步选中值到Spinner
    $("#facebookpack").on("change", function() {
        const selectedVal = parseInt($(this).val());
        if (!isNaN(selectedVal)) {
            $spinner.val(selectedVal).trigger("change");
        } else {
            $spinner.val("").trigger("change");
        }
    });

    // 自定义Spinner减按钮行为:切换到数组中的上一个数值
    $spinner.on("inputSpinner.decrement", function(e) {
        e.preventDefault();
        const currentVal = parseInt($(this).val());
        if (isNaN(currentVal)) return;

        const currentIndex = facebookAmounts.indexOf(currentVal);
        if (currentIndex > 0) {
            $(this).val(facebookAmounts[currentIndex - 1]).trigger("change");
            $("#facebookpack").val(facebookAmounts[currentIndex - 1]);
        }
    });

    // 自定义Spinner加按钮行为:切换到数组中的下一个数值
    $spinner.on("inputSpinner.increment", function(e) {
        e.preventDefault();
        const currentVal = parseInt($(this).val());
        
        if (isNaN(currentVal)) {
            // 若当前为空,默认选中第一个数值
            $(this).val(facebookAmounts[0]).trigger("change");
            $("#facebookpack").val(facebookAmounts[0]);
            return;
        }

        const currentIndex = facebookAmounts.indexOf(currentVal);
        if (currentIndex < facebookAmounts.length - 1) {
            $(this).val(facebookAmounts[currentIndex + 1]).trigger("change");
            $("#facebookpack").val(facebookAmounts[currentIndex + 1]);
        }
    });

    // 可选:限制手动输入仅允许预设数值,同步到下拉框
    $spinner.on("blur", function() {
        const inputVal = parseInt($(this).val());
        if (facebookAmounts.includes(inputVal)) {
            $("#facebookpack").val(inputVal);
        } else {
            $(this).val("");
            $("#facebookpack").val("");
        }
    });
});

4. 额外优化(可选)

如果数据库返回的数值是无序的,建议在控制器中提前排序:

// 在控制器中对集合按amount字段排序
$facebook = FacebookModel::all()->sortBy('amount');

确保Spinner的增减操作按从小到大的顺序切换数值。


内容的提问来源于stack exchange,提问作者Harish Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 17:01:13