如何在 jqGrid 处理之前更改从服务器接收的数据

2024-03-03

我想要实现的场景:

  • 我从服务器检索一些数据
  • 我循环数据并添加/更改某些字段的值
  • 数据显示在网格中
  • 用户在本地编辑数据
  • 完成后,用户将整个网格数据提交到服务器

我如何尝试实现它:

我做了一个 jqGridloadonce:true, editurl:'clientArray'和内联编辑。在loadComplete我循环遍历从服务器接收的数据并添加一些值。外部按钮用于获取网格数据.jqGrid('getGridParam','data')并将其发送到服务器。

loadComplete: function(data){
    for(var i=0; i<data.rows.length; i++){
      var row = data.rows[i];
      grid.jqGrid('setRowData', row.id, {
        missingData: 'someDefaultValue'
      });
    }
}

Problem: The loadComplete当用户更改网格页面或进行搜索时触发事件。这会导致覆盖他编辑的任何数据。我尝试使用beforeProcessing事件代替,但它永远不会触发(编辑:使用本地数据测试时不起作用,但使用 loadonce 时可以)。我在其中找不到任何其他合适的活动文档 http://www.trirand.com/jqgridwiki/doku.php?id=wiki:events.

我在中重现了该场景this https://jsfiddle.net/zohalexix/c09fnaca/9/ demo.

问题:我应该如何在从服务器接收到数据后正确修改数据并让用户在本地编辑,而不会在更改页面或搜索时覆盖他的编辑?

注意:我使用的是 free-jqGrid 4.14


一个应该使用beforeProcessing代替loadComplete对从服务器加载的数据进行一些修改。回调非常实用loadonce: true场景,因为从服务器加载数据后只会调用一次。

理解这一点非常重要,即应该尝试减少更改的数量在 HTML 页面的 DOM 上。如果您在 HTML 解析器处理之前更改数据,那么它的工作速度非常快:您更改一个属性,并且只有该属性会被更改。另一方面,在重新计算之后更改 HTML 页面上的一个元素,并且可能会更改all页面上存在的其他元素。例如,您在网格上插入一个元素。然后网格的位置(以及网格的所有其他元素)将发生变化。至少网络浏览器必须验证是否进行了某些更改all所需的现有元素。它是浏览器回流 https://developers.google.com/speed/articles/reflow。如果您在循环中更改 HTML 元素(例如调用setRowData代替loadComplete)那么它实质上降低了 HTML 页面的速度。

再说一点。我建议您使用 JSFiddle 的 Echo 服务(请参阅here http://doc.jsfiddle.net/use/echo.html)来模拟从服务器加载数据。相应的代码可能如下:

var i, data = [], grid = $('#grid');

for(i=0; i<4; i++) {
    data.push({id:i, select1: i%3});
}

grid.jqGrid({
    datatype: "json",
    mtype: "POST",
    url: "/echo/json/",
    postData: {
        json: JSON.stringify(data)
    },
    loadonce: true,
    forceClientSorting: true,
    caption: 'Testing',
    editurl: 'clientArray',
    rowNum: 2,
    rowList: [2, 4],
    pager: true,
    colModel: [
        {name:'select1', label: 'Server status', editable:true, edittype:'select', formatter:'select', template: "integer", editoptions:{
            value:'0:AAA;1:BBB;2:CCC'
        }},
        {name:'select2', label: 'Local status', editable: true, edittype: 'select', formatter:'select', editoptions:{
            value:'0:AAA;1:BBB;2:CCC'
        }},
        {name:'act', template:'actions'}
    ],
    inlineEditing: {
        keys: true
    },
    beforeProcessing: function(data){
        var i;
        for(i=0; i<data.length; i++){
            data[i].select2 = 0;
        }
    }
});

$('#b1').click(function(){
    $('#out').empty()
    var i, gridData = grid.jqGrid('getGridParam','data');
    for(i=0; i<gridData.length; i++){
       out(JSON.stringify(gridData[i]));
    }
});

function out(message){
    $('#out').append('<p>' + message +'</p>');
}

查看修改后的演示https://jsfiddle.net/OlegKi/c09fnaca/8/ https://jsfiddle.net/OlegKi/c09fnaca/8/。我添加了template: "integer"第一列中仅用于演示数据到数字的转换。免费 jqGrid 支持convertOnSave回调(参见维基文章 https://github.com/free-jqgrid/jqGrid/wiki/Editing-of-local-data#the-main-idea-of-the-implementation),这有助于进行某种转换保存期间本地数据。例如定义以下回调(参见线条 https://github.com/free-jqgrid/jqGrid/blob/v4.14.1/js/jquery.fmatter.js#L169-L172的代码)

convertOnSave: function (options) {
    var nData = options.newValue;
    return isNaN(nData) ? nData : parseInt(nData, 10);
}

结果,第一列中使用的数据将转换为数字,而不是将数据保存为字符串。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 jqGrid 处理之前更改从服务器接收的数据 的相关文章

  • 动态添加案例到交换机

    我需要动态地将案例添加到交换机 我希望用户能够添加项目 并且每个项目都需要它自己的开关盒 您可以使用带有回调函数的对象 You can have initial cases var callbacks something gt 42 and
  • JQuery:为什么元素的相对定位有时会返回窗口顶部 (0,0),而有时会正确返回?

    我试图在 ajax 调用时显示一个繁忙的等待图标 即event target或触发事件的对象 我使用以下代码来实现这一点 但在某些情况下 返回元素的位置 偏移量 是top 0 and left 0 我知道我可能犯了一个错误 但似乎无法纠正
  • 是否可以将对象从 jquery 发布到 Bottle.py?

    这是jquery ajax type POST url posthere dataType json data myDict 1 1 2 2 success function data do code 这是蟒蛇 route posthere
  • 从 php 到 JavaScript 的数组

    我正在尝试使用 json 将数组列表从 php 传输到 javascript 但它不起作用 JS ajax url getProfilePhotos php type post post or get method data if you
  • 实现悬停信息框

    我有一个日历 当用户将鼠标悬停在单元格上时 会出现一个很大的信息框 其中包含该日期的详细信息 虽然当用户离开时使信息框消失 但我遇到了一些麻烦 我基本上想要它 这样当鼠标光标移出信息框隐藏的日历单元格时 它就会消失 但我遇到了麻烦 因为mo
  • 如何使用 jQuery Ajax 将 PHP 数组值传递到另一个文件?

    这是我的代码
  • jQuery 悬停时滚动到 div 并返回到第一个元素

    我基本上有一个具有设定尺寸的 div 和overflow hidden 该 div 包含 7 个子 div 但一次只显示一个 我希望当它们各自的链接悬停时能够平滑地垂直滚动 但是 第一部分 div 没有链接 并且是没有悬停链接时的默认部分
  • Django 将 JSON 数据传递给静态 getJSON/Javascript

    我正在尝试从 models py 中获取数据并将其序列化为views py 中的 JSON 对象 模型 py class Platform models Model platformtype models CharField max len
  • 弹出窗口的动态高度取决于内容,可能吗?

    是否有可能获得一个宽度始终为 400px 的弹出窗口 但根据弹出窗口中的内容动态高度 我已经看到了这个 但不知道如何将其应用到弹出窗口 调整 iframe 的宽度高度以适应其中的内容 https stackoverflow com ques
  • JQuery 删除和内存泄漏

    我正在开发一个游戏 我看到了很多内存消耗 我使用jquery animate 动画完成后 我 remove 元素 我的问题是 从 dom 树中删除一个元素后 对象还存在记忆中吗 Javascript 是一种垃圾收集语言 这意味着当没有代码保
  • 雷达扫描仪旋转效果

    我正在尝试找出一个可能的解决方案 如何使用 jQuery 和 CSS 创建雷达扫描仪效果 本质上 半透明三角形光束将围绕 div 的中点旋转 这可以用 jQuery 实现吗 还是我应该采取其他方法 我不喜欢使用 gif 动画 你不需要 jQ
  • 在画布上绘制多个矩形

    我试图在鼠标移动时在画布上添加多个矩形 但是当我在图像上绘制矩形时 画布上的背面图像也会被清除 我不想删除它 我想要画布上有多个矩形而不清除画布图像 请检查下面的 JavaScript 代码 var canvas document getE
  • CodeIgniter 控制器 - JSON - AJAX

    我正在尝试通过 AJAX 使用 CodeIgniter 发送表单构建 并尝试使用 JSON 获取响应 但是 我只在打开开发人员选项卡时看到响应 我什至不确定这是否实际上是响应 因为它显示了两个 json 数据 它所显示的只是加载旋转器 然后
  • VBA / HTML / jQuery 选择自动完成 - 在列表中选择

    我正在尝试使用 Excel 中的 VBA 在网站的列表中选择一个值 这不是一个 正常列表 该网站使用 jQuery 选择自动完成 如下所示 example http davidwalsh name demo jquery chosen ph
  • 在网页上的文本框中键入内容时删除所有空格

    我如何在用户打字时即时删除输入到文本框中的空格 function var txt myTextbox var func function txt val txt val replace s g txt keyup func blur fun
  • jQuery,REAL:不是等价的运算符?

    此代码行选择任何类名不是 id 和 quantity 的 div 内的所有子输入 div item gt div not id quantity gt input live keydown function event 执行相反操作的代码行
  • 如何让 jquery Tooltipster 插件适用于新创建的 DOM 元素?

    我正在使用 Tooltipster 插件http calebjacob com tooltipster http calebjacob com tooltipster 这很棒 但我已经动态生成了插入到 DOM 中的内容 工具提示程序似乎没有
  • 未捕获的错误:找不到模块“jquery”

    我在用Electron https github com atom electron制作桌面应用程序 在我的应用程序中 我正在加载一个外部站点 Atom 应用程序之外 可以说http mydummysite index html http
  • 如何通过jquery更改元素的类名

    div class bestAnswerControl div class IsBestAnswer div div 我想补充一下 bestanswer some attribute 我想更换class IsBestAnswer div 到
  • 当用户单击链接时,如何记录 MixPanel 事件?

    当用户单击某种类型的链接时 我试图在 MixPanel 中记录一个事件 我正在使用 JQuery 不引人注意地完成此操作 据我所知 我需要添加一个回调函数 以便在记录事件后将用户带到 URL 这是我正在使用的代码 不幸的是

随机推荐