如果在保存网格之前旧值和新值不同时,如何在编辑时比较和显示kendo脏标志
在kendo网格中,当我更改值时,在网格单元格中显示kendo的脏标志。 但是当我单击返回到同一网格单元并将其更改为先前的值(已存在的值)时,仍会显示脏标记。
如何检查该值是否与之前的值类似,并且在保存之前不显示脏标志。
以下是我的kendo可编辑下拉列表代码。
function editCategoryDropDown(container, options) { var catObject = JSON.parse(ticketProjectCategoryObject.value); $('').appendTo(container); var catDropDownTreeView = $("#categoryDDTreeView").kendoExtDropDownTreeView({ treeview: { dataSource: new kendo.data.HierarchicalDataSource({ data: catObject }), //expended: true, loadOnDemand: false, change: function (e) { { var dropDownTreeViewObj = $('#categoryDDTreeView').find('.k-input'); var nodeTitle = dropDownTreeViewObj.attr("title"); if (nodeTitle != null) { options.model.Category = nodeTitle; options.model.CategoryId = dropDownTreeViewObj.attr("nodevalue") options.model.dirty = true; container.addClass("k-dirty-cell"); } }; } }, }).data("kendoExtDropDownTreeView"); var dropDownBox = catDropDownTreeView.dropDownList(); dropDownBox.text(options.model.Category) var treeView = catDropDownTreeView.treeview(); var node = treeView.findByText(options.model.Category.split("|").pop().trim()); treeView.select(node); }
这是一项有趣的任务,所以我花了一些时间进行实验。 考虑以下方法:
-
在Grid的
edit
事件中,将数据项的原始状态(e.model.toJSON()
)保存在某个变量中。toJSON
来剥离特定于Kendo的字段和方法,将数据项转换为普通的JavaScript对象,并打破否则会发生的自动值更新,因为数据项是通过引用传递的。edit: function(e) { var model = e.model; if (!originalDataItems[model.id]) { originalDataItems[model.id] = model.toJSON(); } }
-
在Grid的
save
事件中,将新脏值与原始数据项值进行比较。 如果它们相同,则将自定义CSS类应用于表格单元格。 您需要将代码包装在setTimeout
中的save
处理程序中,因为在已编辑的单元格已关闭并切换回非编辑模式之前会触发此事件。save: function(e) { setTimeout(function() { e.sender.tbody.find(".k-dirty-cell").each(function() { var cell = $(this); var field = e.sender.columns[cell.index()].field; var dataItem = e.sender.dataItem(cell.closest("tr")); cell.toggleClass("no-dirty", originalDataItems[dataItem.id][field] == dataItem[field]); }); }); }
-
自定义CSS类可用于隐藏脏标记,如下所示:
.no-dirty .k-dirty { display: none; }
-
最后,在保存所有挂起的更改时,即在
saveChanges
事件中,从originalDataItems
集合中删除所有项目。saveChanges: function() { originalDataItems = {}; }
这是一个完整的例子:
需要指出的一点是,即使脏标记将被隐藏,相应的数据项仍然是dirty
并且需要与远程数据服务同步。 使用batch
编辑时(如在您的情况下),这是一个小问题,但如果您想要防止不必要的数据传输,请增强save
处理程序并将未修改的数据项的dirty
字段重置为false
。