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

JSGrid中DESTINATION下拉列数据不显示问题求助

问题:JSGrid中DESTINATION列无法显示数据

在Laravel Blade视图中使用JSGrid展示记录,DESTINATION字段已设置为可筛选的下拉菜单,筛选功能正常,但该列无数据显示,其他列均正常加载。

前端JS代码

$(document).ready(function() {

    var stations = [
        { Id : 1,  Name : "NAIROBI"},
        { Id : 2,  Name : "EMBU"},
        { Id : 14, Name : "MWEA"},
        { Id : 15, Name : "RUNYENJES"},
        { Id : 16, Name : "CHUKA"},
        { Id : 17, Name : "MATUU"},
        { Id : 18, Name : "MTWAPA"},
        { Id : 19, Name : "KARURUMO"},
        { Id : 20, Name : "KATHWANA"},
        { Id : 21, Name : "MERU"},
        { Id : 22, Name : "KIRITIRI"},
        { Id : 23, Name : "KIVAA"},
        { Id : 24, Name : "CHIAKARIGA"},
        { Id : 25, Name : "ISHIARA"},
        { Id : 26, Name : "MITUNGUU"},
        { Id : 27, Name : "TUNYAI"},
        { Id : 28, Name : "KIBUGU"},
        { Id : 29, Name : "NKUBU"},
        { Id : 30, Name : "kitui"},
        { Id : 31, Name : "SIAKAGO"},
        { Id : 32, Name : "MOMBASA"},
        { Id : 33, Name : "VOI"},
        { Id : 34, Name : "THIKA"},
        { Id : 35, Name : "EMBU STAGE"},
        { Id : 36, Name : "NAIROBI ERUSHA HSE"},
        { Id : 37, Name : "MWINGI"},
        { Id : 38, Name : "KYENI"},
        { Id : 39, Name : "KANYONYO"},
        { Id : 40, Name : "KABATI"},
        { Id : 41, Name : "KATHAGERI"},
        { Id : 42, Name : "KATHAGERU"},
        { Id : 43, Name : "NENO MWEA OFFICE2"},
        { Id : 44, Name : "kisasi"},
        { Id : 46, Name : "KAEWA"},
        { Id : 47, Name : "RUIRU"},
        { Id : 48, Name : "CHANGAMWE"}
    ];

    $("#jsGrid").jsGrid({

        width: "100%",
        height: "auto",

        loadIndication: true,
        loadMessage: "Please, wait...",
        loadShading: true,

        pageLoading: true,
        pageIndex: 1,
        pageSize: 20,

        inserting: false,
        editing: false,
        sorting: true,
        paging: true,
        filtering: true,
        autoload: true,

        rowClick: function(args) {
            var $row = this.rowByItem(args.item),
            selectedRow = $("#jsGrid").find('tr.highlight');

            // Remove highlight from any previously highlighted row
            if (selectedRow.length) {
                selectedRow.toggleClass('highlight');
            }

            // Highlight the clicked row
            $row.toggleClass("highlight");
        },

        controller: {
            loadData: function(filter) {
                return $.ajax({
                    type: "GET",
                    url: "{{ route('delivery.outgoing_delivery') }}",
                    data: filter,
                    dataType: "json",
                    success: function(response) {
                        var stations = response.stationArray
                    },
                    error: function(jqXHR, textStatus, errorThrown) {
                        console.error("Error loading data:", textStatus, errorThrown); // Debugging line
                    }
                });
            }
        },

        fields: [
            {
                name: "rowIndex",
                title: "#",
                type: "number",
                width: 30,
                align: "center",
                filtering: false,
                itemTemplate: function(_, item) {
                    return $.inArray(item, $("#jsGrid").jsGrid("option", "data")) + 1;
                    }
            },
            { name: "DELIVERY", type: "text", width: 80, validate: "required" },
            {
                name: "DESTINATION",
                type: "select",
                items: stations,
                valueField: "Id",
                textField: "Name",
                filterTemplate: function() {
                    var $select = jsGrid.fields.select.prototype.filterTemplate.call(this);
                    $select.prepend($("<option>").prop("value", "0").text("(All)"));
                    return $select;
                }
            },

            { name: "PARCELS", type: "text", width: 60, validate: "required" },
            { name: "CREATED AT", type: "text", width: 100, validate: "required" },
            { name: "VERIFIED AT", type: "text", width: 100, validate: "required" },
            { name: "VEHICLE", type: "text", width: 70 },
            {
                name: "VERIFIED",
                type: "text",
                width: 50,
                filtering: false,
                validate: "required",
                itemTemplate: function(value) {
                    return value == 1 ? '<i style="color: green;font-size: 16px" class="ti ti-square-rounded-check"></i>' : '<i style="color: red;font-size: 16px" class="ti ti-xbox-x"></i>';
                }
            },
            {
                type: "control",
                filtering: false,
                itemTemplate: function(value, item) {
                    return $("<a>")
                        .attr({
                            href: "#",
                            'data-bs-toggle': 'modal',
                            'data-bs-target': '#modal-outgoing',
                            'data-id': item.DELIVERY
                        })
                        .addClass("ti ti-eye-down")
                        .css({
                            "font-size": "15px",
                            "text-decoration": "none"
                        })
                        .html('<span class="sr-only"></span>');
                }
            }

        ],
    });
});

Laravel控制器代码

// Execute the query with the bindings
$query = DB::select($sql, $bindings);

// Format data to match jsGrid requirements
$output = [];
foreach($query as $transaction){
    $output[] =
    [
        "DELIVERY" => $transaction->delivery_id,
        "DESTINATION" => $transaction->destination,
        "PARCELS" => $transaction->parcel_count,
        "CREATED AT" => $transaction->created_at,
        "VERIFIED AT" => $transaction->verified_at,
        "VEHICLE" => $transaction->delivery_vehicle,
        "VERIFIED" => $transaction->verified,
    ];
};

return response()->json([
    'data' => $output,
    'itemsCount' => $totalCount,
]);

问题原因及解决方案

核心原因

JSGrid的select类型字段配置了valueField: "Id",意味着它会用后端返回的DESTINATION值去匹配stations数组中Id字段的值,然后显示对应的Name。如果后端返回的DESTINATION是站点名称(比如"NAIROBI"),或者返回的Id与stations中的Id类型/数值不匹配,就会找不到对应的选项,导致列显示为空。

解决方案

方案1:修改前端字段配置(适用于后端返回站点名称的情况)

将valueField改为"Name",让JSGrid用后端返回的站点名称直接匹配stations数组中的Name字段:

{
    name: "DESTINATION",
    type: "select",
    items: stations,
    valueField: "Name", // 改为Name,匹配后端返回的站点名称
    textField: "Name",
    filterTemplate: function() {
        var $select = jsGrid.fields.select.prototype.filterTemplate.call(this);
        $select.prepend($("<option>").prop("value", "0").text("(All)"));
        return $select;
    }
}

方案2:修改后端返回数据(适用于应该返回站点Id的情况)

确保控制器中$transaction->destination返回的是与stations数组中Id对应的数字值。比如调整查询逻辑,关联站点表获取对应的Id,而不是名称:

// 示例:假设原查询返回的是站点名称,修改为返回Id
// 需根据实际表结构调整SQL或关联查询
$output[] = [
    "DELIVERY" => $transaction->delivery_id,
    "DESTINATION" => $transaction->destination_id, // 改为站点Id字段
    "PARCELS" => $transaction->parcel_count,
    // 其他字段不变
];

额外优化点

前端loadData的success函数中,var stations = response.stationArray是局部变量,不会更新外部的stations数组。如果后端确实返回了stationArray,应去掉var,让全局stations数组更新:

success: function(response) {
    stations = response.stationArray; // 去掉var,更新全局变量
}

内容的提问来源于stack exchange,提问作者Indeche Ojukwu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 15:09:52