我刚开始使用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();
});
非常感谢
答案 0 :(得分:2)
默认情况下,Ajax请求是异步的,这意味着
if(!status) {
return false;
}
grid.invalidateRow(data.length);
data.push(item);
grid.updateRowCount();
grid.render();
可能会在success
回调之前执行。几种不同的解决方案:
使ajax请求同步(不推荐):
$.ajax({ ... async: false, ...})
将ajax请求后面的所有代码放在success
或complete
回调中。这样的事情(未经测试):
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事件处理程序,向用户显示一条温和的消息,通知他们无法编辑单元格,因为服务器尚未响应并取消编辑。