Javascript 序列化/反序列化剑道网格设置时出现问题
希望有人能找到解决办法。我们有两个网格,在网格列上有自定义的多重选择。问题是,当选择了多个选项时,JSON似乎拒绝正确地序列化/反序列化它们。 这项工作:Javascript 序列化/反序列化剑道网格设置时出现问题,javascript,json,kendo-ui,kendo-grid,telerik-grid,Javascript,Json,Kendo Ui,Kendo Grid,Telerik Grid,希望有人能找到解决办法。我们有两个网格,在网格列上有自定义的多重选择。问题是,当选择了多个选项时,JSON似乎拒绝正确地序列化/反序列化它们。 这项工作: a = $("#grid").data("kendoGrid").getOptions(); $("#grid").data("kendoGrid").setOptions(a); 然而,这打破了: a = JSON.parse(JSON.stringify(
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", "Support", 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);
})
)
@(Html.DCGrid(“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(设置.DefaultPageSize)
.Read(Read=>Read.Action(“Read”,“OrderSearch”).Data(“getParameters”))
)
.Events(e=>e.ColumnReorder(“onColumnReorder”))
.Reorderable(r=>r.Columns(true))
.column菜单()
.列(列=>
{
if(User.IsInRole(“viewOrders”))
{
columns.Template(@)
.ClientTemplate(“#=rowCommandsUndelete(数据,真,假)#”)
.HtmlAttributes(新的{reorderable=“false”})
.标题(“”)
.宽度(86);
}
columns.Bound(o=>o.OrderNum)
.宽度(120);
columns.Bound(o=>o.Status.Name)
.ClientTemplate(“#=clientTemplateOrderStatus(数据)#”)
.宽度(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)
.宽度(120);
columns.Bound(o=>o.DueDate)
.ClientTemplate(“#=clientTemplateDueDate(数据)#”)
.宽度(140);
columns.Bound(o=>o.Product.ID)
.ClientTemplate(“#=ellipseDiv(data.Product.ShortName)#”)
.名称(“产品”)
.Filterable(f=>f.Multi(true).DataSource(ds=>ds.Read(r=>r.Action(“GetData/Product”,“Support”,new{idField=“ID”,nameField=“ShortName”}))).ItemTemplate(“kendoGridFilterData.IDTemplate”))
.宽度(200);
columns.Bound(o=>o.DispatchConfirmNum)
.宽度(140);
.ClientTemplate(CustomGridHelperExtensions.EditTemplate(“Origin”,“Name”)+“#if(drillToValue(数据,'Origin.H2S')){#H2S}#”)
.宽度(250);
columns.Bound(o=>o.OriginTank.TankNum)
.ClientTemplate(“”)
.宽度(100);
columns.Bound(o=>o.OriginBOLNum)
.宽度(130);
columns.Bound(o=>o.Destination.Name)
.ClientTemplate(“”)
.标题(“目的地”)
.宽度(250);
columns.Bound(o=>o.Carrier.Name)
.名称(“承运人”)
.ClientTemplate(“”)
.宽度(170);
columns.Bound(o=>o.Driver.FullName)
.ClientTemplate(“”)
.宽度(170);
})
)
这是idtemplate(javascript):
IDTemplate:函数(e){
返回“:data.Name | data.all” ”;
}
我们关心的唯一选项是排序、筛选、列可见性、列宽和列位置(用于重新排列)。您不能将函数字符串化。例如:
let test = {
label: 'this is label',
calculate: function(){
return 2 + 2;
}
};
let toString = JSON.stringify(test);
console.log(toString); //returns {"label":"this is label"}
- 未定义、函数和符号不是有效的JSON值。如果有
在转换过程中会遇到这样的值,或者忽略它们 (在对象中找到时)或更改为null(在对象中找到时)
数组)。当传入“pure”时,JSON.stringify()可以返回undefined
值,如JSON.stringify(function(){})或
stringify(未定义)
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;
}
}
}
可以显示所有列的网格初始化吗?可以。请给我一分钟时间编辑问题问题是
getOptions()
返回许多无法用setOptions()设置的选项。我会将您的OQ改为您试图更改的选项,并仅使用该选项。你认为有可能吗?我已经补充了这个问题,列出了我们关心的属性。你的代码为我指出了解决问题的正确方向,还有telerik支持专家的帮助。非常感谢。被破坏的代码是将过滤器直接设置到网格的数据源,而不是setOptions,这过于复杂了。编写它的人通过覆盖事件基本上关闭了网格的同步功能,然后分别设置过滤器、排序和列。他设置过滤器的方式被打破了。我的实现使用.setOptions设置它们。我必须在列上保留现有函数,这样我们的自定义过滤器就不会被破坏。
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);