2011-06-06 134 views
1

我刚开始使用slickgrid(++作者btw) - 遇到几个小问题 - 我想使用上下文编辑动态更新一些字段。一旦编辑完成,我希望将其发送到服务器,该服务器还应验证发送的内容。如果出现错误,我想以类似于validatr事件的方式处理错误。例如突出显示单元格,并且不让用户移动,直到它有效,但是我看不到我能做到这一点?任何意见,将不胜感激!使用Slickgrid对onCellChange进行验证

到目前为止的代码...

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

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

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

可能会在success回调之前执行。一对夫妇不同的解决方案:

  • 发出Ajax请求同步(不推荐):

    $.ajax({ ... async: false, ...}) 
    
  • 把所有跟随在successcomplete回调Ajax请求的代码。事情是这样的(未测试):

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

+0

感谢您的答复, 感谢有关异步点,已经修改为你所提到的。 理想情况下,当状态为false时,它会以与验证器工作类似的方式进行响应(例如,闪烁有问题的单元,并且在输入有效的输入之前不会让它关闭)是否有意义? – Xrender 2011-06-06 15:11:17

+0

是的,这是有道理的。不过,我并不熟悉SlickGrid知道如何实现这一点。 – 2011-06-06 16:36:06

1

我推荐的两个选项之一:

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

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