Javascript 序列化/反序列化剑道网格设置时出现问题

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(

希望有人能找到解决办法。我们有两个网格,在网格列上有自定义的多重选择。问题是,当选择了多个选项时,JSON似乎拒绝正确地序列化/反序列化它们。 这项工作:

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("&nbsp;")
                            .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);