如何在 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 处理之前更改从服务器接收的数据 的相关文章

  • 禁用输入中的空格,并允许后退箭头?

    我试图禁用用户名文本字段中的空格 但是我的代码也禁用后退箭头 有什么办法也允许后退箭头吗 function var txt input UserName var func function txt val txt val replace s
  • 在淘汰赛应用程序中使用 setInterval 进行轮询实现?

    我正在尝试使用 setInterval 实现简单的轮询机制 我有一个视图模型如下 define knockout jquery function ko function ViewModel var self this setInterval
  • 匹配数组中的对象并合并

    UPDATE 我有一个名为的对象数组cars包含 li 标签 其中包含有关汽车的属性数据 例如价格 汽车类型等 我的目标是 如果这些汽车符合某些标准 则将它们合并到一个列表中 要求 快速性能 保持相同的汽车数组结构 Main Goal Ma
  • JavaScript 中的正则表达式用于验证十进制数字

    我想要 JavaScript 中的正则表达式来验证十进制数字 它最多只允许两位小数 例如 它应该允许10 89但不是10 899 它还应该只允许一个句点 例如 它应该允许10 89但不是10 8 9 尝试使用以下表达式 d d 0 2 如果
  • 使用 jQuery 检查输入是否为空

    我有一个表单 我希望填写所有字段 如果单击某个字段然后未填写 我想显示红色背景 这是我的代码 apply form input blur function if input text is empty this parents p addC
  • 使用 jquery 通配符检查 cookie 名称

    我有一个生成动态 cookie 的表单 例如 webform 62 1234356 62 1234356 可以是任意数字 我需要使用一些通配符检查来检查名称以 webform 开头的 cookie 是否存在 下面不起作用 if cookie
  • 比较表中的行以了解字段之间的差异

    我有一个包含 20 多列的表 客户端 其中大部分是历史数据 就像是 id clientID field1 field2 etc updateDate 如果我的数据如下所示 10 12 A A 2009 03 01 11 12 A B 200
  • 有没有好的 JQuery twitter 小部件可以循环推文?

    我想知道是否有任何 JQuery 小部件提供了循环加载推文的功能 例如在官方小部件中http twitter com about resources widgets widget profile http twitter com about
  • 将 jQuery 版本从 1.7.1 升级到 1.11.2

    在我当前的应用程序中 我使用的是 jQuery 版本 1 7 1 现在 我计划将jQuery版本升级到1 11 2 是否有任何补丁可以提供与现有应用程序的向后可比性 Thanks 尝试这个 http blog jquery com 2013
  • 支持换行的 JQuery 工具提示

    我正在寻找一个轻量级的 jquery 插件 用于在用户将鼠标悬停在元素上时显示工具提示 我希望插件从标题属性中获取内容 而且我可以创建新行也很重要 任何帮助表示赞赏 在 jQuery 1 9 jquery jquery ui 和标准 too
  • jqGrid刷新本地数据(JSON对象)

    我正在尝试将 jqGrid 与本地数据一起使用 但发现了几个问题 我正在初始化这样的事情 function refreshGrid grid results grid jqGrid data results datatype local c
  • 如何找到div的第一个直接子元素

    这应该很容易 但我做不到 我有一个 id 为 LeftScrollableDiv 的 div 元素 我试图找到它下面的第一个子元素 LeftScrollableDiv first child div table table div 但结果为
  • `attr('checked', false)` 不适用于 IE6

    正如标题所说 我无法获取 attr checked false 在 IE6 上工作 我正在克隆一些 HTML 然后在将新克隆的 HTML 分配给元素之前 我会运行它并取消选中新克隆部分中的所有复选框 这在除 IE 6 之外的所有浏览器中都可
  • defaultDate 选项与 setDate 方法之间的差异

    我正在尝试使用jQueryUI DatePicker 我必须了解的主要事情之一是在页面加载时设置日期的方式 经过一些研究后 我发现有两种不同的方法可以做到这一点 using defaultDate option using setDate
  • 如何删除除任何特定 id 之外的元素

    假设有一个父 id 其中包含许多元素 我想删除除一个元素之外的所有元素 ex parent id children not id n remove
  • 使用 AJAX 加载部分视图不起作用

    请原谅我 我是 MVC 和 AJAX 的新手 目前我只是提交一个表单 我想使用表单中的数据使用 ajax 更新部分视图中的表 My UserInfo部分视图如下所示 model IEnumerable
  • 防止垃圾邮件按钮呼叫功能

    如何防止调用函数时出现垃圾邮件按钮 就像用户只能在按钮上每 1 秒调用一次该函数 有办法做到吗 因为我尝试了 setTimeout 但没有成功 它仍然在发送垃圾邮件 顺便说一句 我使用 Jquery 这是我的代码
  • 按下回车键时不刷新页面

    我遇到了一些问题 只要表单中有输入 回车键就会触发页面刷新 下面的代码 如果按下回车并且文本区域 input 中没有输入任何文本 则不会刷新页面 但是如果按下回车并且 input中有输入或者光标位于文本区域 我不确定是什么触发了它 因为 s
  • 如何通过单击链接来更改 div 的内容?

    这是我的网页的 修改后的 jsfiddle 它还有很多 而且定位是正确的 与此相反 http jsfiddle net ry0tec3p 1 http jsfiddle net ry0tec3p 1 a href class btn1 st
  • 滚动顶部不符合预期

    Note 由于上次忘记奖励而重新开放赏金 A Woff 大师已经给出答案 我想在用户展开某一行时到达该行 这样当最后一个可见行展开时 用户不必向下滚动即可查看内容 I used example tbody on click td green

随机推荐