laravel-admin解决列表筛选后select联动没默认选上

Ambition
发布于 2024-07-04 / 2 阅读
0

laravel-admin解决列表筛选后select联动没默认选上

最近接了一个活,需要开发一个功能,用到的框架是laravel-admin,其中筛选需要做到联动,之前我们表单联动出现一个问题就是编辑的时候不会自动选上,筛选这里也是有同样问题,就是筛选后也不会联动,不过解决思路差不多类似,这里跟大家分享如何解决这个问题。

       我们先写一个接口,用来返回第二个select的选项,代码如下

#获取参数
$storeId = $request->input("q", 0);
#查询包间列表
$roomList = Room::where("store_id", $storeId)->get(['id', DB::raw('title as text')]);
#返回
return $roomList;

接口地址是api/store/getRoomList。

       然后我们在列表放两个select,并进行联动,同时我们需要在第二个select的回调里面处理一下筛选后填充的选项,不然的话,筛选后,第二个select是没有内容的。

#门店筛选
$filter->equal('store_id', '门店')->select(Store::all()->pluck('title', 'id'))->load('room_id', '/api/store/getRoomList');
#包间筛选
$filter->equal('room_id', '包间')->select(function () {
 //获取请求中的 store_id
 $storeId = request('store_id');
 //如果有选中的 room_id,加载该门店下的所有包间
 if($storeId){
  return Room::where('store_id', $storeId)->pluck('title', 'id');
 }
 //如果没有 store_id,返回空选项
 return [];
});

       最后我们通过js来控制,让他默认选上,代码如下

#JS调控
Admin::script("
  $(function () {
    // 当门店选择发生变化时
    $('select[name=\"store_id\"]').on('change', function () {
        let storeId = $(this).val();
        let roomSelect = $('select[name=\"room_id\"]');

        // 根据 storeId 获取房间列表并更新 roomSelect
        $.ajax({
            url: '/api/store/getRoomList',
            data: {q: storeId},
            success: function (data) {
                roomSelect.empty();
                $.each(data, function (id, title) {
                    roomSelect.append(new Option(title, id));
                });

                // 如果有默认选中的 room_id,则设置为选中状态
                let selectedRoomId = \"{{ request('room_id') }}\";
                roomSelect.val(selectedRoomId);
            }
        });
    });
  });          
");

这样我们就可以确保在筛选后第二个select会默认选上我们选择的选项,同时还能展示其他选项出来。

       不得不说,这个真的很坑。