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

Laravel中使用Select2联动下拉框出现数据重复的解决求助

省份联动地点下拉框数据重复问题解决方案

问题描述

已实现省份选择联动地点名称功能,省份数据展示与获取正常,但地点下拉框出现重复数据(数据库中无重复记录)。

相关代码

view.blade 中的JS代码

$(document).ready(function() {

            $("#selectProv").select2({
                placeholder:"Pilih Provinsi",
                ajax: {
                    url: "{{ route('advance.provinsi') }}",
                    processResults: function({data}){
                        console.log(data);
                        return {
                            results: $.map(data, function(item){
                                return {
                                    id: item.id,
                                    text: item.provinsi
                                }
                            })
                        }
                    }
                }
            });

            $("#selectProv").change(function() {
                let id = $('#selectProv').val();
                
                $("#selectLoc").select2({
                    placeholder:"Pilih Lokasi",
                    ajax: {
                        url: "{{ url('/selectLoc') }}/" + id,
                        processResults: function({data}){
                            console.log(data);
                            return {
                                results: $.map(data, function(item){
                                    // console.log(item);
                                    return {
                                        id: item.id,
                                        text: item.lokasi
                                    }
                                })
                            }
                        }
                    }
                });
                
            });  

});

Controller 代码

class locationController extends Controller
{
    public function provinsi() {
        $prov = Provinsi::where('provinsi', 'LIKE', '%'.request('q').'%') -> orderBy('provinsi','asc') -> paginate(50);

        return response() -> json($prov);
    }

    public function lokasi($id) {
        $lokasi = Lokasi::where('provinsi_id', $id) -> where('lokasi', 'LIKE', '%'.request('q').'%') -> orderBy('lokasi','asc') -> paginate(50);

        return response() -> json($lokasi);
    }
}

问题原因

每次省份选择变化时,都重复调用$("#selectLoc").select2()初始化下拉框,导致Select2实例被多次创建,此前加载的选项未被清空,新选项叠加后出现重复。

解决方案

方案一:单次初始化+动态刷新(推荐)

只在页面加载时初始化地点下拉框,通过动态修改AJAX地址、触发刷新来更新数据,避免重复实例化:

$(document).ready(function() {
    // 初始化省份下拉框
    $("#selectProv").select2({
        placeholder:"Pilih Provinsi",
        ajax: {
            url: "{{ route('advance.provinsi') }}",
            processResults: function({data}){
                return {
                    results: $.map(data, function(item){
                        return {
                            id: item.id,
                            text: item.provinsi
                        }
                    })
                }
            }
        }
    });

    // 提前初始化地点下拉框,配置动态URL
    $("#selectLoc").select2({
        placeholder:"Pilih Lokasi",
        ajax: {
            url: function() {
                let provId = $('#selectProv').val();
                return "{{ url('/selectLoc') }}/" + (provId || '');
            },
            processResults: function({data}){
                return {
                    results: $.map(data, function(item){
                        return {
                            id: item.id,
                            text: item.lokasi
                        }
                    })
                }
            }
        },
        // 初始禁用,选择省份后启用
        disabled: true
    });

    $("#selectProv").change(function() {
        let id = $(this).val();
        // 启用/禁用地点下拉框
        $("#selectLoc").prop('disabled', !id);
        // 清空现有选项并触发重新加载
        $("#selectLoc").val(null).trigger('change');
    });  
});

方案二:销毁旧实例后重新初始化

如果需要保留原有逻辑,可在每次初始化前销毁已存在的Select2实例:

$("#selectProv").change(function() {
    let id = $('#selectProv').val();
    
    // 销毁已有的Select2实例
    if ($("#selectLoc").data('select2')) {
        $("#selectLoc").select2('destroy');
    }
    
    $("#selectLoc").select2({
        placeholder:"Pilih Lokasi",
        ajax: {
            url: "{{ url('/selectLoc') }}/" + id,
            processResults: function({data}){
                return {
                    results: $.map(data, function(item){
                        return {
                            id: item.id,
                            text: item.lokasi
                        }
                    })
                }
            }
        }
    });
});

说明

方案一性能更优,仅初始化一次Select2实例,同时通过禁用状态引导用户操作,提升体验;方案二适合快速修改现有代码,但多次销毁/创建实例可能带来额外性能开销。

内容的提问来源于stack exchange,提问作者Farhan Akmal Shaleh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:35:56