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

dxDataGrid中setCellValue内调用Ajax失效问题求助

解决dxDataGrid setCellValue中异步Ajax更新newData不生效的问题

问题原因

Ajax是异步操作,setCellValue方法会在Ajax请求完成前就执行完毕,DevExtreme已经基于当时的newData完成了单元格状态更新,后续在success回调中修改newData不会触发组件重新渲染,导致变更不生效。

解决方案

方案1:利用异步setCellValue(推荐)

dxDataGrid支持setCellValue返回Promise,组件会等待Promise完成后再应用所有数据变更。修改代码如下:

setCellValue: function(newData, value, currentRowData) {
    newData.supplies = value;
    let dataSupp = value.split(' &*& ');
    newData.supplies_code = dataSupp[0];
    newData.supplies_unit = dataSupp[2];
    let sales = $('#sales').val();
    let expected_revenue = $('#expected_revenue').val();
    let order_use_from = $('#order_use_from').val();
    let order_use_to = $('#order_use_to').val();

    // 返回Promise,让组件等待异步操作完成
    return new Promise((resolve, reject) => {
        $.ajax({
            type: 'POST',
            url: "{{ route('admin.shopping-request.per-mil') }}",
            data: {
                sales: sales,
                expected_revenue: expected_revenue,
                order_use_from: order_use_from,
                order_use_to: order_use_to,
                dataSupp: dataSupp
            },
            success: function(response) {
                console.log(response);
                newData.per_mil = response;
                resolve(); // 通知组件异步操作完成,应用newData的所有变更
            },
            error: function(xhr) {
                console.error('请求失败:', xhr);
                reject(xhr); // 通知组件操作失败,避免无限等待
            }
        });
    });
}

这种方式完全遵循DevExtreme的原生数据更新流程,能保证newData的所有变更(包括Ajax回调中设置的per_mil)被正确应用。

方案2:手动调用grid API更新行数据

如果不需要依赖setCellValue的同步逻辑,可以直接通过grid实例的updateRow方法手动更新行数据:

setCellValue: function(newData, value, currentRowData) {
    newData.supplies = value;
    let dataSupp = value.split(' &*& ');
    newData.supplies_code = dataSupp[0];
    newData.supplies_unit = dataSupp[2];
    let sales = $('#sales').val();
    let expected_revenue = $('#expected_revenue').val();
    let order_use_from = $('#order_use_from').val();
    let order_use_to = $('#order_use_to').val();
    
    // 获取当前行的唯一标识(根据你的数据结构调整,比如currentRowData.id)
    const rowKey = currentRowData.key;
    // 获取dxDataGrid实例(假设grid的DOM id为myDataGrid)
    const gridInstance = $('#myDataGrid').dxDataGrid('instance');

    $.ajax({
        type: 'POST',
        url: "{{ route('admin.shopping-request.per-mil') }}",
        data: {
            sales: sales,
            expected_revenue: expected_revenue,
            order_use_from: order_use_from,
            order_use_to: order_use_to,
            dataSupp: dataSupp
        },
        success: function(response) {
            console.log(response);
            // 手动更新行数据
            gridInstance.updateRow(rowKey, { per_mil: response });
        }
    });
}

这种方式需要确保能正确获取行的唯一键值,适合简单场景,但可能会和setCellValue的原生流程产生冲突,需谨慎使用。

内容的提问来源于stack exchange,提问作者Toàn Kiều Văn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 10:52:06