2

我刚刚开始使用 slickgrid(顺便说一句,作者是 ++)——遇到了一些小问题——我想使用上下文编辑动态更新一些字段。编辑完成后,我希望将其发送到服务器,该服务器也应该验证发送的内容。如果出现错误,我想以与验证事件的工作方式类似的方式处理错误?例如,突出显示单元格,在它有效之前不要让用户离开,但是我不明白我该怎么做?对此的任何建议将不胜感激!

到目前为止的代码...

grid.onCellChange.subscribe(function(e, args) {
    var item = args.item;
    var column = args.cell;       
    var row = args.row;
    var value = data[args.row][grid.getColumns()[args.cell].field];
    var id = args.item.id;
    var field = grid.getColumns()[args.cell].field;
    var dataString = "id="+id+"&field="+field+"&value="+value;
    var status = false;
    $.ajax({
        type: "POST",
        url: "/en/<?php echo $this->controller; ?>/updateattribute/&callback=?'",
        data: dataString,
        dataType: "json",
        success: function(a) {  
            console.log(data);              
            if(a.status == true) {                  
                status = true;
            } else {
                status = false;             
            }       
            return false; 
        }
    });    
    if(!status) {
        return false;
    }             
    grid.invalidateRow(data.length);
    data.push(item);
    grid.updateRowCount();
    grid.render();
});

非常感谢

4

2 回答 2

2

默认情况下,Ajax 请求是异步的,这意味着

if(!status) {
    return false;
}             
grid.invalidateRow(data.length);
data.push(item);
grid.updateRowCount();
grid.render();

可能会在success回调之前执行。几个不同的解决方案:

  • 使 ajax 请求同步(不推荐):

    $.ajax({ ... async: false, ...})
    
  • 将 ajax 请求之后的所有代码放在successorcomplete回调中。像这样的东西(未经测试):

    grid.onCellChange.subscribe(function(e, args) {
        // snip...
    
        $.ajax({
            type: "POST",
            url: "/en/<?php echo $this->controller; ?>/updateattribute/&callback=?'",
            data: dataString,
            dataType: "json",
            success: function(a) {  
                console.log(data);              
                if(a.status) {                  
                    grid.invalidateRow(data.length);
                    data.push(item);
                    grid.updateRowCount();
                    grid.render();
                }
            }
        });
    });
    

jQuery 的延迟对象也可以提供一种简洁的方式来编写它。

于 2011-06-06T14:18:35.610 回答
1

我会推荐以下两种选择之一:

  • 将您的更改提交到服务器进行验证。显示一个微调器以直观地指示后台进程正在运行,并在验证进行时暂时禁用编辑和单元格导航。收到响应后,重新启用编辑和导航或将单元格切换回编辑模式并显示验证错误。

  • 与上面相同,但继续导航,只需禁用编辑。添加一个 onBeforeCellEdit 事件处理程序以向用户显示一条温和的消息,通知他们无法编辑单元格,因为服务器尚未响应并取消编辑。

于 2011-06-06T18:20:23.270 回答