我想让我的代码能够在更改单元格时立即更新数据库表。但是,我可以获得更改的单元格的值,而不是下一个单元格的数据。
方法我已经尝试过但没有成功:
grid.onCellChange.subscribe(
function (e, args) {
//alert(data[args.row][grid.getColumns()[args.cell].field]);
//alert(grid.getColumns()[args.cell].name);
//alert(args);
<%
updateDatabase("UPDATE table1 "+
"SET "+
" col1="+data[args.row][grid.getColumns()[args.cell].field]+" "+
"WHERE "+
" col2="+???)")
%>
}
);
如何获取我可以在where
子句中使用的下一列的值?
答案 0 :(得分:5)
解决您的问题:
如果您查看官方SlickGrid Editing演示,可以尝试以下操作来基本了解网格编辑的工作原理。打开JS调试器并使用以下命令订阅网格onCellChange
事件:
grid.onCellChange.subscribe(
function (e,args) {
console.log('row: ' + args.row + ' cell: ' + args.cell)
});
网格的onCellChange
事件args
参数对象包含两个属性:
现在编辑任何单元格,离开刚刚编辑过的单元格。这很重要,因为此事件只会触发 blur 事件。
在控制台日志中,您将看到例如:
行:6个单元格:1
寻址您的数据对象:
我发现,只有使用eval()
hackish 的方式,我才能找到地址您的数据源的唯一方法。有关对象属性访问的更多信息,您可以查看this answer。
来自Javascript术语的一点:
使用给定 fieldname 或属性名称来解决数据对象的实际eval()
命令是:
eval('data[args.row]'+'.'+columns[args.cell].field)
简化它将评估表示为字符串的JavaScript代码,在此SlickGrid Editing example中,它将变得像你要写的那样:
data[6].title
所以概念证明代码是:
grid.onCellChange.subscribe(
function (e,args) {
console.log(eval('data[args.row]'+'.'+columns[args.cell].field))
});
这将返回当前编辑的单元格的值。例如,更改args.cell+1
将返回网格数据源中的下一个单元格值。当然,您应该始终检查columns.length
属性,以使列索引键保持在数组边界内。
关于updateDatabase
调用的想法:为什么要在每次触发此事件后更新数据库?我建议你看一下有编辑表格的官方Composite editor演示。
我强烈建议的另一件事是你不直接将服务器端或代码代码写入 javascript < / em>代码块。例如,您可以使用ajax post。
我建议这样做的原因是因为那时你将使用分隔 responsibilities分开函数。只要坚持这个原则本身就可以让你有一个更清晰的代码,你也只能给出一个改变的理由。此外,它可以帮助testing您的功能更轻松。