【发布时间】:2020-03-17 15:01:47
【问题描述】:
这是我的数据的简化示例:
[{"Name": "Bob", "Count":3}, {"Name": "Steve", "Count":5}]
我想要的是一个图表标题:Total FOO: 8。所以标题必须基于数据。数据是 AJAX,这是一个 ASP.MVC 应用程序。
在我的 CSHTML 中,我有:
.DataSource(ds => ds.Read(read => read.Action("MeMethodName", "MyControllerName")))
.Events(events => events.DataBound("setChartTitle('chartName', 'Total FOO')"))
这是我必须做的疯狂黑客:
function setChartTitle(name, title) {
let chart = $("#" + name).data("kendoChart");
if (chart) {
let ds = chart.dataSource;
let total = 0;
for (let i = 0; i < ds.data().length; i++) {
total += ds.data()[i].Count;
}
chart.options.title.text = title + ": " + total;
chart.refresh();
} else if (arguments.length < 3) {
// Data source was not found and this was initiated through Kendo. Wait and try again but only once
setTimeout(function () {
sumEntityCount(name, title, "stop");
}, 500);
}
}
这真的很糟糕。
- 访问
kendoChart返回未定义,但图表本身调用它。这就是为什么我需要检查上面的if (chart)。 - 这导致我添加了一个 ELSE 块,我可以在 500 毫秒延迟后再次调用它。仅此一项就是一个错误,因为 500 毫秒是一个随机数,可能还不够。我不能这样发货。
- 为了防止递归,我用不同的参数调用同一个函数。
- 如果找到值,那么我不能只设置图表选项。我需要打电话给
refresh,它会重绘所有内容。
问题:
- 为什么最初未定义 kendoChart 数据?为什么 Telerik 打电话给
dataBound却什么都没有?! - 没有
dataBinding事件吗?我不想事后这样做,也不想刷新整个事情。
【问题讨论】:
标签: kendo-ui kendo-asp.net-mvc kendo-chart