Javascript 剑道格网:取消编辑删除新行

Javascript 剑道格网:取消编辑删除新行,javascript,kendo-ui,telerik,kendo-grid,Javascript,Kendo Ui,Telerik,Kendo Grid,以下是我所经历的行为的一个例子 如果编辑id为1的现有行,将文本更改为其他内容,然后按“取消”按钮,则该行将正确恢复为其以前的状态 为了重现我的问题,您需要: 添加新行 按更新按钮保存它。 再次选择该行,然后按更新按钮。 按取消按钮 争吵消失了! 尽管在这个问题上也有类似的问题,但我还没有找到一个令人满意的答案 有些人说我需要定义一个id。正如你从我的演示中看到的,这没有任何区别,新行有一个id,它仍然会消失 当您使用远程数据源时,有一些建议,但这在我的情况下不起作用,我需要使用本地数据 最后是

以下是我所经历的行为的一个例子

如果编辑id为1的现有行,将文本更改为其他内容,然后按“取消”按钮,则该行将正确恢复为其以前的状态

为了重现我的问题,您需要:

添加新行 按更新按钮保存它。 再次选择该行,然后按更新按钮。 按取消按钮 争吵消失了! 尽管在这个问题上也有类似的问题,但我还没有找到一个令人满意的答案

有些人说我需要定义一个id。正如你从我的演示中看到的,这没有任何区别,新行有一个id,它仍然会消失

当您使用远程数据源时,有一些建议,但这在我的情况下不起作用,我需要使用本地数据


最后是答案。虽然它确实可以防止新行消失,但取消该行并不会将数据恢复到原来的状态,它只会关闭编辑器,并且数据在编辑后会保持原样。

这是因为id仍然设置为其默认值。数据源将这些数据项视为新数据项,取消它们会将其删除。保存一个新项目后,您需要将其id设置为非默认值。

我用它修改了您的更改,它似乎可以工作。 我所做的唯一更改是将“id”列重命名为“ided”

不知何故,剑道示例中显示的“id”列名不起作用,对我来说,它似乎是一个bug

model: {
  id: 'ided',
  fields: {
    ided: { type: 'number' },
    description: { type: 'string' },
    begin: { type: 'date' }
  }
}

这似乎只是一个bug,但您仍然可以通过下面的代码获得所需的输出

我引入了新的变量tempSavedRecords和update 使用剑道保存或删除记录时使用该变量 数据源数据。 当用户单击“取消”按钮时,用tempSavedRecords填充剑道数据源

希望这有帮助。谢谢。 $document.readyfunction{ var tempSavedRecords=null; var gridDataSource=new kendo.data.DataSource{ 数据:[ {id:1,描述:'Test 1',begin:new Date} ], 模式:{ 型号:{ id:'id', 字段:{ id:{type:'number'}, 描述:{type:'string'}, 开始:{type:'date'} } } } }; $'grid'.kendoGrid{ 数据源:gridDataSource, 可滚动:对, 可排序:是的, 工具栏:[“创建”], 栏目:[ {字段:'id',标题:'id',宽度:'auto'}, {字段:'description',标题:'description',宽度:'auto'}, {字段:“开始”,标题:“开始”,宽度:“自动”,格式:{0:d}, {命令:['edit','destroy'],标题:'',宽度:'172px'} ], 可编辑:{ 模式:“内联”, 确认:错误 }, 保存:functione{ 更新记录; }, 取消:功能E{ iftempSavedRecords!=空{ $'grid'.data'kendoGrid'.dataSource.datatempSavedRecords; } 否则{ $'grid'.data'kendoGrid'.dataSource.cancelChanges; } }, 移除:函数e{ $'grid'.data'kendoGrid'.dataSource.removee.model 更新记录; } }; 函数updateTempRecords{ tempSavedRecords=$'grid'.data'kendoGrid'.dataSource.data; tempSavedRecords=tempSavedRecords.toJSON; } }; 测验
我也有同样的问题。我通过调用数据源的cancelChanges方法解决了这个问题:

..
cancel: function(e) {
            $('#mainGrid').data('kendoGrid').dataSource.cancelChanges();
        },
..

我可以通过在添加新行后重新设置数据对象来解决这个问题

例如:

function onInsertNewRow(dataItem) {
  myDataSource.insert(dataItem);
  myDataSource.data(myDataSource.data());
}
通过调用数据方法,您可以对网格说,分配的新数据是基础数据,新行不再是新的


我希望这对你有帮助。

听起来像是个bug,不是吗?你报告了吗?是的。但由于我对剑道没什么经验,我总是假设我做错了什么:-当然,如果没有人指出我代码中的错误,我会将其报告为错误。您可以尝试使用一个局部变量来存储新值,并在用户单击“取消”时恢复为旧值,如我的回答中所述。您尝试过我提供的解决方案吗?抱歉,我没有尝试过您的解决方案,自从我上次使用剑道UII已经好几年了,我确实设置了id的值,列是可编辑的。即使我没有,我也不明白为什么取消编辑新项目会删除它们,这对我来说毫无意义。如果我们不更新记录,你的解决方案会起作用。如果我们更新记录,它将创建新记录,因为并没有唯一的方法来引用行。检查一下这个,这真的很好用。对于任何未来的读者->非常重要
function onInsertNewRow(dataItem) {
  myDataSource.insert(dataItem);
  myDataSource.data(myDataSource.data());
}