0

0

jqGrid 动态数据刷新教程:解决数据不更新问题

霞舞

霞舞

发布时间:2025-11-14 12:05:11

|

183人浏览过

|

来源于php中文网

原创

jqGrid 动态数据刷新教程:解决数据不更新问题

本教程旨在解决 jqgrid 在动态数据加载时无法正确刷新的常见问题。当 jqgrid 实例被重复初始化时,会导致数据不更新。文章将详细介绍两种核心解决方案:一是通过销毁并重建网格来确保每次加载都是全新状态;二是在网格已初始化后,利用 `setgridparam` 方法高效更新数据并触发刷新。通过实际代码示例,帮助开发者理解并实现 jqgrid 的正确动态数据管理。

jqGrid 动态数据刷新概述

在 Web 应用开发中,我们经常需要根据用户操作(如选择下拉菜单项、点击按钮)动态加载或更新表格数据。jqGrid 作为一个功能强大的 JavaScript 网格控件,提供了丰富的 API 来处理这类需求。然而,不正确的实现方式可能导致网格数据无法按预期刷新,尤其是当网格被重复初始化时。

本教程将深入探讨导致 jqGrid 动态刷新失效的根本原因,并提供两种主流且有效的解决方案,帮助开发者正确管理 jqGrid 的生命周期和数据更新。

问题分析:为什么 jqGrid 数据不刷新?

在提供的代码示例中,getReport 函数负责从后端获取数据并初始化或更新 jqGrid。这个函数在下拉菜单的 onchange 事件中被调用。核心问题在于,每次调用 getReport 函数时,都尝试通过 grid.jqGrid({...}) 来“创建”网格:

grid.jqGrid({
    datastr: dt.records,
    datatype: "jsonstring",
    // ... 其他配置
});
jQuery("#list2").trigger("reloadGrid");

grid.jqGrid({...}) 方法用于初始化一个新的 jqGrid 实例。一旦一个 HTML 元素(如 #list2)已经被成功初始化为 jqGrid,再次对其调用 jqGrid({...}) 方法将不会重新初始化或更新网格。它只会尝试创建一个新的实例,但由于该元素已经是一个 jqGrid 实例,后续的调用实际上是无效的。jQuery("#list2").trigger("reloadGrid") 在这种情况下也无法生效,因为它尝试刷新一个已经初始化但未被正确更新数据的网格。

正确的做法是:只在第一次加载时初始化 jqGrid。后续的数据更新操作应该通过 jqGrid 提供的特定 API 来完成。

解决方案一:销毁并重建 jqGrid

当需要完全重置网格的配置、列模型,或者只是想确保每次加载都是一个全新的网格实例时,销毁并重建是一个可行的方案。

适用场景

  • 网格的列定义、尺寸或其他核心配置可能随数据源或用户选择而改变。
  • 需要彻底清除旧网格状态,确保没有残留的事件监听器或数据。
  • 对性能要求不是极致,可以接受重建网格带来的少量开销。

实现步骤

  1. 在每次初始化 jqGrid 之前,检查网格是否已经存在。
  2. 如果网格已存在,先将其销毁。
  3. 然后,重新初始化 jqGrid。

不同的 jqGrid 版本(如 Guriddo jqGrid JS 或 free-jqGrid)销毁网格的方法可能略有不同。常见的销毁方法是使用 GridUnload。

// 假设 grid 变量已经定义
// var grid = jQuery("#list2");

function getReport(start_date, end_date) {
    $.ajax({
        url: "logics/inventory_reports",
        type: "POST",
        data: {
            type: "getTrailBalance_report",
            start_date: start_date,
            end_date: end_date,
        },
        success: function (data) {
            let dt = JSON.parse(data);

            // 检查网格是否已存在并销毁它
            // 注意:对于 free-jqGrid,通常是 $('#list2').jqGrid('GridUnload');
            // 对于 Guriddo jqGrid,可能需要根据具体版本和初始化方式调整
            if ($("#list2").hasClass('ui-jqgrid-btable')) { // 检查网格是否已初始化
                 $("#list2").jqGrid('GridUnload');
                 // 或者如果你的 grid 变量直接是 jQuery 对象,也可以这样:
                 // grid.jqGrid('GridUnload');
            }

            // 重新初始化 jqGrid
            grid.jqGrid({
                datastr: dt.records,
                datatype: "jsonstring",
                height: "auto",
                loadui: "disable",
                pgbuttons: false,
                pginput: false,
                colNames: ["Items", "Debit", "Credit"],
                colModel: [
                    {name: "name", width: 250, resizable: false, sortable: false},
                    {name: "debit", width: 150, sortable: false},
                    {name: "credit", width: 150, sortable: false}
                ],
                treeGrid: true,
                pager: '#gridpager',
                caption: "Trail Balance Report",
                ExpandColumn: "elementName",
                autowidth: true,
                rowNum: 10000,
                jsonReader: {
                    root: "response"
                }
            }).navGrid('#gridpager', {
                view: true,
                del: false,
                search: false,
                autoRefresh: true,
            });

            // 销毁并重建后,不需要额外 trigger("reloadGrid"),因为数据已在初始化时传入
        }
    });
}

注意事项:

腾讯交互翻译
腾讯交互翻译

腾讯AI Lab发布的一款AI辅助翻译产品

下载
  • GridUnload 方法会移除与 jqGrid 实例相关的所有 HTML 元素和数据,并将原始的 <table> 元素恢复到其初始状态。
  • 请根据你使用的 jqGrid 具体版本查阅文档,确认正确的销毁方法。

解决方案二:使用 setGridParam 更新数据

当网格的结构(如列模型)保持不变,只有数据需要更新时,使用 setGridParam 是更高效、更推荐的方法。它避免了销毁和重建网格的开销。

适用场景

  • 网格的列定义、分页器等配置在整个生命周期中保持不变。
  • 只需要替换网格中的行数据。
  • 对性能有较高要求,希望减少 DOM 操作。

实现步骤

  1. 在页面加载时,只初始化 jqGrid 一次
  2. 后续的数据更新操作中,使用 setGridParam 方法更新网格的 datastr 或 url 参数。
  3. 调用 trigger("reloadGrid") 来触发网格刷新。

为了实现这一点,我们需要一个标志位来判断 jqGrid 是否已经初始化。

// 在全局或父级作用域中定义 grid 变量和初始化标志
var grid = null; // 或者 jQuery("#list2"); 如果你希望在外部定义它
var grid_is_initialized = false;

// 初始创建 jqGrid 的 HTML 结构
// $('<table id="list2"></table>' + '<div id="gridpager"></div>').appendTo('#topics');
// grid = jQuery("#list2"); // 确保 grid 变量指向正确的 jQuery 对象

function getReport(start_date, end_date) {
    $.ajax({
        url: "logics/inventory_reports",
        type: "POST",
        data: {
            type: "getTrailBalance_report",
            start_date: start_date,
            end_date: end_date,
        },
        success: function (data) {
            let dt = JSON.parse(data);

            if (grid_is_initialized) {
                // 如果网格已初始化,则更新其数据并重新加载
                grid.jqGrid('setGridParam', {
                    datastr: dt.records, // 更新数据源
                    datatype: "jsonstring" // 确保数据类型正确
                }).trigger("reloadGrid"); // 触发网格刷新
            } else {
                // 首次调用,初始化 jqGrid
                grid = jQuery("#list2"); // 确保 grid 变量指向正确的 jQuery 对象
                grid.jqGrid({
                    datastr: dt.records,
                    datatype: "jsonstring",
                    height: "auto",
                    loadui: "disable",
                    pgbuttons: false,
                    pginput: false,
                    colNames: ["Items", "Debit", "Credit"],
                    colModel: [
                        {name: "name", width: 250, resizable: false, sortable: false},
                        {name: "debit", width: 150, sortable: false},
                        {name: "credit", width: 150, sortable: false}
                    ],
                    treeGrid: true,
                    pager: '#gridpager',
                    caption: "Trail Balance Report",
                    ExpandColumn: "elementName",
                    autowidth: true,
                    rowNum: 10000,
                    jsonReader: {
                        root: "response"
                    }
                }).navGrid('#gridpager', {
                    view: true,
                    del: false,
                    search: false,
                    autoRefresh: true,
                });
                grid_is_initialized = true; // 设置标志位,表示网格已初始化
            }
        }
    });
}

注意事项:

  • 确保 grid 变量在 getReport 函数外部被正确声明和初始化,以便在多次调用中保持其引用。
  • 如果你的 datatype 是 "json" 并且 jqGrid 自己通过 url 发送请求,那么你可能需要更新 url 参数或 postData 参数,然后调用 trigger("reloadGrid")。
  • 本例中 datatype 为 "jsonstring",这意味着数据是直接通过 datastr 参数提供的,而不是由 jqGrid 自身通过 AJAX 请求获取的。因此,更新 datastr 是正确的做法。

原始 getTimePeriod 方法的集成

getTimePeriod 方法负责根据下拉菜单的选择计算 start_date 和 end_date,然后调用 getReport。这个逻辑是正确的,并且不需要修改。

function getTimePeriod() {
    let timePeriod = $("#time_period").val();
    let periodDate = new Date();
    let date = new Date(), y = date.getFullYear(), m = date.getMonth();
    let message = "";
    let FYear;
    let start_date = new Date();
    // debugger; // 调试点

    switch (timePeriod) {
        case 'cDay':
            periodDate = new Date();
            message = 'Current Day';
            break;
        case 'lDay':
            start_date.setDate(start_date.getDate() - 1);
            periodDate.setDate(periodDate.getDate() - 1);
            message = 'Last Day';
            break;
        // ... 其他 case 逻辑保持不变
        case 'cMonth':
            start_date = new Date(y, m, 1);
            periodDate = new Date(y, m + 1, 0);
            message = 'Current Month';
            break;
        case 'lMonth':
            start_date = new Date(y, m - 1, 1);
            periodDate = new Date(y, m, 0);
            message = 'Last Month';
            break;
        // ... 其他日期计算逻辑
    }

    // 假设 getDateInFormat 和 ReFormateDate 是你提供的日期格式化函数
    document.getElementById("showDate").innerHTML = getDateInFormat(periodDate);
    getReport(ReFormateDate(start_date), ReFormateDate(periodDate));
}

注意: ReFormateDate 和 getDateInFormat 函数在原始问题中未提供,但它们对于将 Date 对象转换为后端或显示所需的字符串格式至关重要。请确保这些函数实现正确。

总结与最佳实践

在 jqGrid 的动态数据刷新场景中,理解其生命周期和数据加载机制至关重要。

  1. 避免重复初始化: 切勿在每次数据更新时都尝试重新调用 grid.jqGrid({...}) 来初始化网格。
  2. 选择合适的刷新策略:
    • 如果网格结构和配置需要经常改变,或者需要彻底重置网格,使用销毁并重建(GridUnload)。
    • 如果仅是数据内容发生变化而网格结构保持不变,使用 setGridParam 更新数据参数并调用 trigger("reloadGrid"),这是更高效和推荐的方法。
  3. 管理网格状态: 使用一个全局或父级作用域的变量来存储 jqGrid 实例,并使用一个布尔标志来跟踪网格是否已初始化,以便在后续操作中做出正确判断。
  4. 日期格式化: 确保传递给后端 API 的日期格式与后端期望的格式一致。

通过遵循这些原则,你可以有效地管理 jqGrid 的动态数据刷新,提升用户体验和应用性能。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

457

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

547

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

335

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

jquery插件有哪些
jquery插件有哪些

jquery插件有jQuery UI、jQuery Validate、jQuery DataTables、jQuery Slick、jQuery LazyLoad、jQuery Countdown、jQuery Lightbox、jQuery FullCalendar、jQuery Chosen和jQuery EasyUI等。本专题为大家提供jquery插件相关的文章、下载、课程内容,供大家免费下载体验。

156

2023.09.12

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

335

2023.10.13

jquery删除元素的方法
jquery删除元素的方法

jquery可以通过.remove() 方法、 .detach() 方法、.empty() 方法、.unwrap() 方法、.replaceWith() 方法、.html('') 方法和.hide() 方法来删除元素。更多关于jquery相关的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

406

2023.11.10

jQuery hover()方法的使用
jQuery hover()方法的使用

hover()是jQuery中一个常用的方法,它用于绑定两个事件处理函数,这两个函数将在鼠标指针进入和离开匹配的元素时执行。想了解更多hover()的相关内容,可以阅读本专题下面的文章。

515

2023.12.04

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 6万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.4万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号