kendo ui 网格在出错时重复销毁操作
kendo ui grid repeat the destroy action on error
我有一个类似于下面代码的网格。
如果销毁操作发生错误,它们会累积。
例如,在第一个错误 1 调用销毁操作,第二个 2 调用,第三个错误 3 调用......
经过一番调查后,我发现要删除的项目存储在数据源中的数组 (_destroyed) 中,
因此,每次单击销毁按钮时,都会为这些项目中的每一个调用销毁操作。
我尝试将 null 分配给 _destroyed 数组,但是当我再次调用 destroy 操作时这给了 js 错误。
@(Html.Kendo().Grid<someType>()
.Name("grid")
.Columns(columns =>
{
columns.Bound(p => p.Name);
columns.Command(command =>
{
command.Edit();
command.Destroy();
}).Width(250);
})
.Editable(editable => { editable.Mode(GridEditMode.PopUp); editable.TemplateName("myTemplate"); })
.Pageable()
.Sortable()
.Filterable()
.DataSource(dataSource => dataSource
.Ajax()
.PageSize(50)
.Events(events => events.Error("error_handler"))
.Model(model => model.Id(p => p.Id))
.Create(update => update.Action("EditingPopup_Create", "myController"))
.Read(read => read.Action("EditingPopup_Read", "myController"))
.Update(update => update.Action("EditingPopup_Update", "myController"))
.Destroy(update => update.Action("EditingPopup_Destroy", "myController"))
)
<script type="text/javascript">
function error_handler(e) {
if (e.errors) {
var message = "Errors:\n";
$.each(e.errors, function (key, value) {
if ('errors' in value) {
$.each(value.errors, function () {
message += this + "\n";
});
}
});
alert(message);
$(".k-grid").each(function () {
var grid = $(this).data("kendoGrid");
if (grid !== null && grid.dataSource == e.sender) {
grid.one('dataBinding', function (e) {
e.preventDefault();
});
grid.dataSource.read();
grid.refresh();
}
});
}
}
</script>
一个
好的,我不确定这是否是一个合理的答案,但这解决了我的问题
grid.dataSource._destroyed = [];
grid.dataSource.read();
grid.refresh();
我希望它可以节省一些时间。
可以调用数据源的cancelChanges
方法,然后read
。无需调用 grid.refresh()
,因为它会在 dataSource.read()
完成后自动调用。
我有一个类似于下面代码的网格。
如果销毁操作发生错误,它们会累积。
例如,在第一个错误 1 调用销毁操作,第二个 2 调用,第三个错误 3 调用......
经过一番调查后,我发现要删除的项目存储在数据源中的数组 (_destroyed) 中,
因此,每次单击销毁按钮时,都会为这些项目中的每一个调用销毁操作。
我尝试将 null 分配给 _destroyed 数组,但是当我再次调用 destroy 操作时这给了 js 错误。
@(Html.Kendo().Grid<someType>()
.Name("grid")
.Columns(columns =>
{
columns.Bound(p => p.Name);
columns.Command(command =>
{
command.Edit();
command.Destroy();
}).Width(250);
})
.Editable(editable => { editable.Mode(GridEditMode.PopUp); editable.TemplateName("myTemplate"); })
.Pageable()
.Sortable()
.Filterable()
.DataSource(dataSource => dataSource
.Ajax()
.PageSize(50)
.Events(events => events.Error("error_handler"))
.Model(model => model.Id(p => p.Id))
.Create(update => update.Action("EditingPopup_Create", "myController"))
.Read(read => read.Action("EditingPopup_Read", "myController"))
.Update(update => update.Action("EditingPopup_Update", "myController"))
.Destroy(update => update.Action("EditingPopup_Destroy", "myController"))
)
<script type="text/javascript">
function error_handler(e) {
if (e.errors) {
var message = "Errors:\n";
$.each(e.errors, function (key, value) {
if ('errors' in value) {
$.each(value.errors, function () {
message += this + "\n";
});
}
});
alert(message);
$(".k-grid").each(function () {
var grid = $(this).data("kendoGrid");
if (grid !== null && grid.dataSource == e.sender) {
grid.one('dataBinding', function (e) {
e.preventDefault();
});
grid.dataSource.read();
grid.refresh();
}
});
}
}
</script>
一个
好的,我不确定这是否是一个合理的答案,但这解决了我的问题
grid.dataSource._destroyed = [];
grid.dataSource.read();
grid.refresh();
我希望它可以节省一些时间。
可以调用数据源的cancelChanges
方法,然后read
。无需调用 grid.refresh()
,因为它会在 dataSource.read()
完成后自动调用。