问题描述
希望有人有解决方案。我们有几个网格在网格列上具有自定义多选。 The issue is that JSON seems to be refusing to properly serialize/deserialize them when there's more than one option selected. 这有效:
a = $("#grid").data("kendoGrid").getoptions();
$("#grid").data("kendoGrid").setoptions(a);
但是这会中断:
a = JSON.parse(JSON.stringify($("#grid").data("kendoGrid").getoptions()));
$("#grid").data("kendoGrid").setoptions(a);
而令人讨厌的部分是它绝对是等式的序列化部分搞砸了,因此证明很难确切地发现它应该如何与修改后的实际外观。字符串比较是相等的。有什么建议吗?
示例中断:a 列有一个复选框下拉网格过滤器,其中包含三个选项:1、2、3。选择多个选项会在保存然后加载时破坏网格。只选择一个或零个作品。
编辑:这里是网格初始化:请注意,DCGrid 是对剑道网格的覆盖,它设置了所有网格共有的属性,例如页面大小。
@(Html.DCGrid<Order>("grid")
.DataSource(dataSource => dataSource
.Ajax()
.sort(s => { if (Request.QueryString.Keys.Count == 0) { s.Add(x => x.OrderNum).Ascending(); } })
.Model(model => model.Id(o => o.ID))
.PageSize(Settings.DefaultPageSize)
.Read(read => read.Action("Read","OrderSearch").Data("getParameters"))
)
.Events(e => e.ColumnReorder("onColumnReorder"))
.Reorderable(r => r.Columns(true))
.ColumnMenu()
.Columns(columns =>
{
if (User.IsInRole("viewOrders"))
{
columns.Template(@<text></text>)
.ClientTemplate("#= rowCommandsUndelete(data,true,false) #")
.HtmlAttributes(new { reorderable = "false" })
.Title(" ")
.Width(86);
}
columns.Bound(o => o.OrderNum)
.Width(120);
columns.Bound(o => o.Status.Name)
.ClientTemplate("#= clientTemplateOrderStatus(data) #")
.Width(120);
columns.Bound(o => o.Priority.ID).Title("Priority").Width(100)
.Filterable(f => f.Multi(true).DataSource(ds => ds.Read(r => r.Action("GetData/Priority","Support",new { nameField = "PriorityNum" }))).ItemTemplate("kendoGridFilterData.IDTemplate"));
columns.Bound(o => o.OrderDate)
.Width(120);
columns.Bound(o => o.DueDate)
.ClientTemplate("#= clientTemplateDueDate(data) #")
.Width(140);
columns.Bound(o => o.Product.ID)
.ClientTemplate("#=ellipseDiv(data.Product.ShortName)#")
.Title("Product")
.Filterable(f => f.Multi(true).DataSource(ds => ds.Read(r => r.Action("GetData/Product",new { idField = "ID",nameField = "ShortName" }))).ItemTemplate("kendoGridFilterData.IDTemplate"))
.Width(200);
columns.Bound(o => o.dispatchConfirmNum)
.Width(140);
.ClientTemplate(CustomGridHelperExtensions.EditTemplate("Origin","Name") + " #if(drillTovalue(data,'Origin.H2S')) {# <span class='label label-danger margin-left-right-5px'>H2S</span> #}#")
.Width(250);
columns.Bound(o => o.OriginTank.TankNum)
.ClientTemplate("<a href='/OriginTanks?OriginId=#=data.OriginID#'>#=ellipseDiv(data.OriginTank.TankNum)#</a>")
.Width(100);
columns.Bound(o => o.OriginBOLNum)
.Width(130);
columns.Bound(o => o.Destination.Name)
.ClientTemplate("<a href='/Destinations?id= #=data.DestinationID# '>#=ellipseDiv(data.Destination.Name)#</a>")
.Title("Destination")
.Width(250);
columns.Bound(o => o.Carrier.Name)
.Title("Carrier")
.ClientTemplate("<a href='/carriers?id= #=data.CarrierID# '>#=ellipseDiv(data.Carrier.Name)#</a>")
.Width(170);
columns.Bound(o => o.Driver.FullName)
.ClientTemplate("<a href='/Drivers?IDNumber=#=data.Driver.IDNumber# '>#=ellipseDiv(data.Driver.FullName)#</a>")
.Width(170);
})
)
这是 idtemplate (javascript):
IDTemplate: function (e) {
return "<li><label class='k-label'><input type='checkBox' value='#:data.ID#'/>#:data.Name || data.all#</label></li>";
}
我们关心的唯一选项是排序、过滤器、列可见性、列宽和列位置(用于重新排列)。
解决方法
您不能对函数进行字符串化。例如:
let test = {
label: 'this is label',calculate: function(){
return 2 + 2;
}
};
let toString = JSON.stringify(test);
console.log(toString); //returns {"label":"this is label"}
- undefined、Functions 和 Symbols 不是有效的 JSON 值。如果有
在转换过程中遇到这些值,它们要么被省略 (在对象中找到时)或更改为 null(在
中找到时) 大批)。 JSON.stringify() 传入 "pure" 时可以返回 undefined
像 JSON.stringify(function(){}) 或
这样的值 JSON.stringify(undefined)。
您可以遍历加载选项中的列并再次设置属性,如下所示:
let optionsObject = JSON.parse(options);
for (let i = 0; i < optionsObject.columns.length; i++) {
let column = optionsObject.columns[i];
if (column.field) {
switch (column.field) {
case 'field1':
column.template = kendo.template($('#field-1-template').html());
break;
case 'field2':
column.template = kendo.template($('#field-2-template').html());
break;
default:
break;
}
}
}
为列设置属性后,然后设置网格选项:
$("#grid").data("kendoGrid").setOptions(optionsObject);