Slickgrid - 如何获取已编辑单元格的值?

Jam*_*mes 0 javascript slickgrid

我想让我的代码能够在更改单元格时立即更新数据库表.但是,我可以获得更改的单元格的值,而不是下一个单元格的数据.

方法我已经尝试过但没有成功:

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="+???)") 
        %>
    }
);
Run Code Online (Sandbox Code Playgroud)

如何获取我可以在where子句中使用的下一列的值?

kay*_*ess 5

解决你的问题:

如果您查看官方的SlickGrid编辑演示,您可以尝试以下方法来基本了解网格编辑的工作原理.打开JS调试器并onCellChange使用以下命令订阅网格事件:

grid.onCellChange.subscribe(
    function (e,args) {
        console.log('row: ' + args.row + ' cell: ' + args.cell)
    });
Run Code Online (Sandbox Code Playgroud)

grid的onCellChangeevents args参数对象包含两个属性:

  • 细胞

现在编辑任何单元格并离开刚刚编辑过的单元格.这很重要,因为此事件只会触发模糊事件.

在控制台日志中,您将看到例如:

行:6个单元格:1

寻址您的数据对象:

我发现如何解决您的数据源的 唯一方法是使用hackish方式eval().有关对象属性访问的更多信息,您可以检查答案.


有点来自Javascript术语:

eval()使用给定的fieldname属性名称来处理数据对象的实际命令是:

eval('data[args.row]'+'.'+columns[args.cell].field)
Run Code Online (Sandbox Code Playgroud)

简化它将评估表示为字符串的JavaScript代码,在此SlickGrid编辑示例中,它将变得像您要编写的那样:

data[6].title
Run Code Online (Sandbox Code Playgroud)

所以概念证明代码是:

grid.onCellChange.subscribe(
    function (e,args) {
        console.log(eval('data[args.row]'+'.'+columns[args.cell].field))
    });
Run Code Online (Sandbox Code Playgroud)

这将返回当前编辑的单元格的值.例如,更改args.cell+1将返回网格数据源中的下一个单元格值.当然,您应该始终检查columns.length属性以将列索引键保留在数组边界内.


关于您对该updateDatabase调用的想法:为什么您希望在每次触发此事件后更新数据库?我建议你看一下具有编辑表格的官方复合编辑器演示.

我强烈建议的另一件事是你不要代码服务器端或代码直接写入javascript代码块.例如,您可以使用ajax帖子.

我推荐这个的原因是因为那时你将分离出具有独立 职责的功能.只要坚持这个原则本身就可以让你有一个更清晰的代码,你也只能给出一个改变的理由.此外,它可以帮助您更轻松地测试您的功能.