如何通过 javascript JSON 更新 KendoUI 图表?

Posted

技术标签:

【中文标题】如何通过 javascript JSON 更新 KendoUI 图表?【英文标题】:How do I update a KendoUI chart via javascript JSON? 【发布时间】:2014-01-06 13:16:40 【问题描述】:

所以我有一个使用 MVC 样式配置配置的图表...

@(html.Kendo().Chart<DIMVC.ViewModel.CompanyProduction>(Model.CompanyProduction)
     .Name("Chart")
     .Title("Files sent")
     .Legend(legend => legend
     .Position(ChartLegendPosition.Bottom)
 )
 .ChartArea(chartArea => chartArea
     .Background("transparent")
 )
 .SeriesDefaults(seriesDefaults =>
     seriesDefaults.Line().Style(ChartLineStyle.Smooth)
 )
.Series(series =>  
     series.Line(model => model.SentFiles).Name("Sent Files");
     ...   lots more series added here 

.CategoryAxis(axis => axis
     .Categories(model => model.MonthDisplay)
     .Labels(labels => labels.Rotation(-90))
)
.ValueAxis(axis => axis.Numeric()
     .Labels(labels => labels.Format("0:N0"))
     .MajorUnit(10000)
)
.Tooltip(tooltip => tooltip
    .Visible(true)
    .Format("0:N0")
)
.Events(e => e
    .SeriesClick("onSeriesClick")
)

)

我在页面上也有一个滑块。当滑块值改变时,我处理这个事件。

@(Html.Kendo().RangeSlider()
    .Name("yearRange")
    .Min(2000)
    .Max(DateTime.Today.Year)
    .SmallStep(1)
    .LargeStep(5)
    .Values(Model.MinYear, Model.MaxYear)
    .Events(e => e.Change("yearRangeChange"))
 )

javascript 方法

function yearRangeChange(e)

     var url = "/FetchData/";

     $.ajax(
         type: "GET",
         url: url,
         data:  startYear: e.values[0], endYear: e.values[1] ,
         dataType: "json",
         success: function (json) 

        $("#DINETChart").kendoChart(
            dataSource: 
               data: json
        
    );

     var chart = $("#DINETChart").data("kendoChart");
    chart.refresh();
 
 ); 
 

现在当图表更新时,网格只是空白。

json请求调用成功,获取数据。 但图表填充后,图表为空白。

有人有什么建议吗?

* 编辑 *

添加返回的 JSON 样本

"[\"CompanyID\":1,\"Year\":2011,\"Month\":8,\"SentFiles\":1666,\"ReceivedFiles\":1632,\"SentData\":12803.674593292486,\"ReceivedData\":11908.047586546765,\"Note\":null,\"MonthDisplay\":\"Aug\",\"CompanyDisplay\":null,\"CompanyID\":1,\"Year\":2013,\"Month\":10,\"SentFiles\":21004,\"ReceivedFiles\":20387,\"SentData\":157376.825542573,\"ReceivedData\":152878.87845794103,\"Note\":null,\"MonthDisplay\":\"Oct\",\"CompanyDisplay\":null,\"CompanyID\":1,\"Year\":2013,\"Month\":4,\"SentFiles\":9989,\"ReceivedFiles\":9880,\"SentData\":74913.53277995327,\"ReceivedData\":75145.16331588416,\"Note\":null,\"MonthDisplay\":\"Apr\",\"CompanyDisplay\":null,\"CompanyID\":1,\"Year\":2013,\"Month\":11,\"SentFiles\":25956,\"ReceivedFiles\":25249,\"SentData\":196155.8977337967,\"ReceivedData\":189320.44546897494,\"Note\":null,\"MonthDisplay\":\"Nov\",\"CompanyDisplay\":null]"

我还想指出,如果我添加这个

.DataSource(ds => ds.Read(read =>
    read.Action("FetchData", "Home", new  startYear = 2012, endYear = 2013 )
))

对于我的图表配置,这将很好地填充图表,而不使用页面Model。 即图表的数据是正确的。

【问题讨论】:

返回的 JSON 是什么样子的? @LarsHöppner 将 JSON 添加到问题中 【参考方案1】:

数据源需要一个数组作为其 data 的值,但看起来您分配的 json 变量包含一个 JSON 字符串(至少如果您添加到问题的字符串是在json var 中的客户端上看到)。如果您将 dataType 设置为“json”,jQuery 通常应该为您解析(不知道为什么您没有发生这种情况 - 您应该仔细检查 dataType 参数是否设置正确)。

你可以尝试自己解析;除此之外,您还应该使用chart.setDataSource() 而不是创建新图表。他们现在这样做的方式是,您只需将原始图表替换为其配置,并使用没有配置的图表。在你的回调中尝试这样的事情:

var data = JSON.parse(json);
var chart = $("#DINETChart").data("kendoChart");
var dataSource = new kendo.data.DataSource(
    data: data
);
chart.setDataSource(dataSource);

请注意,在您的 yearRangeChange 函数中,您尝试在 ajax 成功调用之外的图表上调用刷新。当您使用setDataSource 时,您不需要refresh,但即使您需要这样做,它也必须在回调中。否则它会在 ajax 调用完成之前发生。

【讨论】:

抱歉我的混淆我Stringified我的JSON使它人类可读。使用上面的代码按预期工作:D

以上是关于如何通过 javascript JSON 更新 KendoUI 图表?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 php 或 javascript 在不刷新页面的情况下自动更新 JSON 数据?

如何正确分离 JavaScript 视图/逻辑代码 [关闭]

通过 PATCH 进行部分更新:如何解析 JSON 数据以进行 SQL 更新?

如何通过带有 cookie 身份验证的 Javascript 获取 JSON 数据?

在 JavaScript 中查找 JSON

如何通过php更新sql中的json数据