【问题标题】:Sending a table/grid object over AJAX通过 AJAX 发送表格/网格对象
【发布时间】:2014-07-08 14:22:15
【问题描述】:

简要说明...

我的站点中有一个可编辑的 jqWidgets 网格,但与传统的可编辑网格不同,我不想在编辑行时更新数据库,而是希望在按下“保存”按钮时立即更新整个网格。

考虑到这一点,我只能看到两种可能的选择:

  1. 以某种方式将整个网格对象字符串化为查询字符串并向服务器发送 1 个 AJAX 请求。
  2. 或者,遍历每一行并对网格中的每一行执行 AJAX 请求

我遇到的问题是,我根本无法弄清楚哪种方法更好,因为它们都有其复杂性。当用户试图通过 POST 请求传递网格的全部内容时,选项 1 上的查询字符串可能是天文数字并超出内存限制。但是,后一种解决方案可能会因为它正在为网格中的每一行执行 AJAX 请求而导致问题。想象一下,如果网格中有 100 行,甚至 1000 行!

我的问题

那么,任何人都可以想出一种有效的方法来实现这一点而不超出内存限制,同时又避免发出多个 AJAX 请求?


更多信息

如果上述内容不清楚,请考虑以下 javascript 数组:

[
    { name: 'Ben', age: 23, occupation: 'Developer' },
    { name: 'Charlie', age: 24, occupation: 'Receptionist' },
    { name: 'Jemima', age: 18, occupation: 'Designer' }
]

现在,尝试确定在一个查询中将所有这些信息传递给 PHP 的最佳方法吗?

【问题讨论】:

  • 执行一个 AJAX 请求。 1000 行文本仍然仅在千字节范围内,您不会遇到内存限制。如果您真的担心效率,您应该想出一种方法,只为已更改的数据发送 AJAX 更新,而不是一次发送整个表。
  • @abmitchell 我打算过滤掉没有改变的行,但我仍然有字符串化数组的问题......任何指针?
  • 同时 100 个 AJAX 请求将使任何浏览器都崩溃。如果您可以确保服务器上有足够的资源可用,那么您应该发送一个请求并且等待它被处理。将其添加到处理队列。不过,您可以查看 websockets。那可能更聪明。
  • 有 JSON.stringify 。
  • @BenCarey 照Sergiu 说的做,通过JSON.stringify(yourArray),没必要再复杂了

标签: javascript php jquery ajax jqxgrid


【解决方案1】:

在您的源对象上,有一个 updaterow 函数,它接受参数 rowid、newdata 和 commit:

updaterow: function(rowid, newdata, commit)

newdata 是一个 json 对象,表示网格中更新的行,commit 是一个回调,您需要调用该回调来考虑更改已被接受。

在此函数中,您可以获取更新后的 rowdata 对象并将其放入基于 rowid 的关联数组中(以确保更改的行只被发送回一次)。最后,调用

commit(true)

您现在可以在单击按钮时调用一个函数,该函数使用更新的行数据执行 ajax 发布:

var editedRows = {};
var source = {
  localdata: [], // your data for the grid
  datatype: 'json',
  datafields: [
    // define columns and types
  ],
  updaterow: function(rowid, datarow, commit) {
    editedRows[rowid] = datarow;
    commit(true);
  }
}

var saveData = function() {
  // post editedRows, clear editedRows on success
};

【讨论】:

    猜你喜欢
    • 2016-07-17
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 2018-11-09
    相关资源
    最近更新 更多