使用Slickgrid验证onCellChange

时间:2011-06-06 14:12:38

标签: slickgrid

我刚开始使用slickgrid(++给作者btw) - 遇到一些小问题 - 我想使用上下文编辑动态更新某些字段。编辑完成后,我希望将其发送到服务器,服务器也应该验证发送的内容。如果有错误,我想以与validatr事件的工作方式类似的方式处理错误?例如突出显示单元格,不要让用户移动直到它有效,但是我不知道怎么能这样做?对此有任何建议将不胜感激!

到目前为止

代码......

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();
});

非常感谢

2 个答案:

答案 0 :(得分:2)

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

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

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

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

    $.ajax({ ... async: false, ...})
    
  • 将ajax请求后面的所有代码放在successcomplete回调中。这样的事情(未经测试):

    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的deferred object也可以提供一种干净的方式来写这个。

答案 1 :(得分:1)

我建议使用以下两个选项之一:

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

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