Chart.setOptions() Kendo UI 中的错误
Chart.setOptions() Bug in Kendo UI
我正在为 HTML5 使用 KendoUI 进行一个项目。我注意到图表小部件中的一个错误,其中 setOptions() 始终不起作用。这是重现错误的片段。
基本上,上面的代码片段创建了一个包含一些随机数据的图表。我还有一个复选框,用户可以在其中 enable/disable 缩放和平移图表。最初创建的图表没有设置 zoomable/pannable。
实际操作:
<!DOCTYPE html>
<html>
<head>
<base href="https://demos.telerik.com/kendo-ui/bar-charts/pan-and-zoom">
<style>
html {
font-size: 14px;
font-family: Arial, Helvetica, sans-serif;
}
</style>
<title></title>
<link rel="stylesheet" href="//kendo.cdn.telerik.com/2016.2.607/styles/kendo.common-material.min.css" />
<link rel="stylesheet" href="//kendo.cdn.telerik.com/2016.2.607/styles/kendo.material.min.css" />
<link rel="stylesheet" href="//kendo.cdn.telerik.com/2016.2.607/styles/kendo.default.mobile.min.css" />
<script src="//kendo.cdn.telerik.com/2016.2.607/js/jquery.min.js"></script>
<script src="//kendo.cdn.telerik.com/2016.2.607/js/kendo.all.min.js"></script>
</head>
<body>
<div id="example">
<div class="box wide">
<input type="checkbox" id="eq1" class="k-checkbox">
<label class="k-checkbox-label" for="eq1">Enable Zoom</label>
<p id="para">Use SHIFT + Mouse Drag Region Selection combination on mouse-enabled devices to zoom in data for a specific period of time</p>
</div>
<div class="demo-section k-content wide">
<div id="chart"></div>
<div id="log" style="
height: 120px;
overflow: scroll;
padding: 20px;
border: 1px solid black;">
</div>
</div>
<script>
// Sample data
var data = [];
for (var i = 0; i < 50; i++) {
var val = Math.round(Math.random() * 10);
data.push({
category: "C" + i,
value: val
});
}
function createChart() {
$("#chart").kendoChart({
renderAs: "canvas",
dataSource: {
data: data
},
categoryAxis: {
min: 0,
max: 10,
labels: {
rotation: "auto"
}
},
series: [{
type: "column",
field: "value",
categoryField: "category"
}]
});
}
$(document).ready(createChart);
$("#example").bind("kendo:skinChange", createChart);
$("#eq1").click(function(e) {
if (this.checked) {
setZoom({
pannable: {
lock: "y"
},
zoomable: {
mousewheel: {
lock: "y"
},
selection: {
lock: "y"
}
}
});
} else {
setZoom({
pannable: false,
zoomable: false
});
}
});
function setZoom(obj) {
try {
$("#chart").data("kendoChart").setOptions(obj);
} catch (ex) {
$('#log').append($('<div/>').text("Error : " + ex.message + "\n" + ex.stack + "\n"));
}
}
</script>
</div>
</body>
</html>
在用户与复选框(左上角)交互时,使用框架中可用的 chart.setOptions() 方法设置图表的可缩放和平移属性。如果“运行 代码片段”不起作用,请按照以下步骤操作,您可以看到正在运行的错误。
第 1 步:将上面的代码片段复制到 http://dojo.telerik.com/ 的编辑器中
第 2 步:运行 代码。 (结果创建了一个图表)
第 3 步:勾选复选框以启用图表缩放。 (在 x 轴上设置了可缩放和平移属性,以便图表现在可以缩放和平移)
第 4 步:取消选中复选框以禁用图表缩放。 (pannable 被禁用,但图表仍然可以缩放。-这是错误)
第 5 步:再次勾选复选框,您将看到图表下方显示的错误。
如果有人知道如何解决这个问题。如果这是 KendoUI 的错误,那么希望 Kendo 开发团队得到这个。
这很奇怪,对于任何正在寻找解决方法的人来说,您可以使用阻止事件的默认值:
...
zoom: preventThisPlease,
dragStart: preventThisPlease,
...
function preventThisPlease(e) {
if (! document.getElementById('eq1').checked) {
e.preventDefault();
}
}
根据需要刷新复选框更改以重置缩放级别和平移位置:
$("#eq1").click(function(e) {
$("#chart").data("kendoChart").refresh();
});
更新:(更改图表配置选项)。
当我们尝试将 pannable 或 zoomable 设置为 false 时,问题似乎出现了。因此,根据使用 prevent default to disable pan/zoom 的解决方案,我们可以更改图表的选项。查看代码片段:
<!DOCTYPE html>
<html>
<head>
<base href="https://demos.telerik.com/kendo-ui/bar-charts/pan-and-zoom">
<style>
html {
font-size: 14px;
font-family: Arial, Helvetica, sans-serif;
}
</style>
<title></title>
<link rel="stylesheet" href="//kendo.cdn.telerik.com/2016.2.607/styles/kendo.common-material.min.css" />
<link rel="stylesheet" href="//kendo.cdn.telerik.com/2016.2.607/styles/kendo.material.min.css" />
<link rel="stylesheet" href="//kendo.cdn.telerik.com/2016.2.607/styles/kendo.default.mobile.min.css" />
<script src="//kendo.cdn.telerik.com/2016.2.607/js/jquery.min.js"></script>
<script src="//kendo.cdn.telerik.com/2016.2.607/js/kendo.all.min.js"></script>
</head>
<body>
<div id="example">
<div class="box wide">
<form class="chart-switch">
Restrict Pan & Zoom to:
<input type="radio" name="radio" id="eq1" class="k-radio">
<label class="k-radio-label" for="eq1">X</label>
<input type="radio" name="radio" id="eq2" class="k-radio">
<label class="k-radio-label" for="eq2">Y</label>
<input type="radio" name="radio" id="eq3" class="k-radio">
<label class="k-radio-label" for="eq3">X & Y</label>
<input type="radio" name="radio" id="eq4" class="k-radio" checked>
<label class="k-radio-label" for="eq4">None</label>
</form>
<p id="para">Use SHIFT + Mouse Drag Region Selection combination on mouse-enabled devices to zoom in data for a specific period of time</p>
</div>
<div class="demo-section k-content wide">
<div id="chart"></div>
<div id="log" style="
height: 120px;
overflow: scroll;
padding: 20px;
border: 1px solid black;">
</div>
</div>
<script>
// Sample data
var data = [];
for (var i = 0; i < 50; i++) {
var val = Math.round(Math.random() * 10);
data.push({
category: "C" + i,
value: val
});
}
function createChart() {
$("#chart").kendoChart({
renderAs: "canvas",
dataSource: {
data: data
},
categoryAxis: {
min: 0,
max: 10,
labels: {
rotation: "auto"
}
},
series: [{
type: "column",
field: "value",
categoryField: "category"
}],
zoom: preventThisPlease,
dragStart: preventThisPlease,
pannable: {
lock: "x"
},
zoomable: {
mousewheel: {
lock: "x"
},
selection: {
lock: "x"
}
}
});
}
$(document).ready(createChart);
$("#example").bind("kendo:skinChange", createChart);
// Disable Pan/Zoom
function preventThisPlease(e) {
if (document.getElementById('eq4').checked) {
e.preventDefault();
}
}
// Pan/Zoom options changing
$(".chart-switch input").on('change', function(e) {
// Get reference to the chart
var theChart = $("#chart").data("kendoChart");
// See which radio button is checked
var radioId = $(e.target).attr('id');
var toLock = "none";
switch(radioId) {
case "eq1":
toLock = "y";
break;
case "eq2":
toLock = "x";
break;
default:
toLock = "none";
}
try {
theChart.options.pannable.lock = toLock;
theChart.options.zoomable.mousewheel.lock = toLock;
theChart.options.zoomable.selection.lock = toLock;
theChart.refresh();
} catch (ex) {
$('#log').append($('<div/>').text("Error : " + ex.message + "\n" + ex.stack + "\n"));
}
});
</script>
</div>
</body>
</html>
我正在为 HTML5 使用 KendoUI 进行一个项目。我注意到图表小部件中的一个错误,其中 setOptions() 始终不起作用。这是重现错误的片段。
基本上,上面的代码片段创建了一个包含一些随机数据的图表。我还有一个复选框,用户可以在其中 enable/disable 缩放和平移图表。最初创建的图表没有设置 zoomable/pannable。
实际操作:
<!DOCTYPE html>
<html>
<head>
<base href="https://demos.telerik.com/kendo-ui/bar-charts/pan-and-zoom">
<style>
html {
font-size: 14px;
font-family: Arial, Helvetica, sans-serif;
}
</style>
<title></title>
<link rel="stylesheet" href="//kendo.cdn.telerik.com/2016.2.607/styles/kendo.common-material.min.css" />
<link rel="stylesheet" href="//kendo.cdn.telerik.com/2016.2.607/styles/kendo.material.min.css" />
<link rel="stylesheet" href="//kendo.cdn.telerik.com/2016.2.607/styles/kendo.default.mobile.min.css" />
<script src="//kendo.cdn.telerik.com/2016.2.607/js/jquery.min.js"></script>
<script src="//kendo.cdn.telerik.com/2016.2.607/js/kendo.all.min.js"></script>
</head>
<body>
<div id="example">
<div class="box wide">
<input type="checkbox" id="eq1" class="k-checkbox">
<label class="k-checkbox-label" for="eq1">Enable Zoom</label>
<p id="para">Use SHIFT + Mouse Drag Region Selection combination on mouse-enabled devices to zoom in data for a specific period of time</p>
</div>
<div class="demo-section k-content wide">
<div id="chart"></div>
<div id="log" style="
height: 120px;
overflow: scroll;
padding: 20px;
border: 1px solid black;">
</div>
</div>
<script>
// Sample data
var data = [];
for (var i = 0; i < 50; i++) {
var val = Math.round(Math.random() * 10);
data.push({
category: "C" + i,
value: val
});
}
function createChart() {
$("#chart").kendoChart({
renderAs: "canvas",
dataSource: {
data: data
},
categoryAxis: {
min: 0,
max: 10,
labels: {
rotation: "auto"
}
},
series: [{
type: "column",
field: "value",
categoryField: "category"
}]
});
}
$(document).ready(createChart);
$("#example").bind("kendo:skinChange", createChart);
$("#eq1").click(function(e) {
if (this.checked) {
setZoom({
pannable: {
lock: "y"
},
zoomable: {
mousewheel: {
lock: "y"
},
selection: {
lock: "y"
}
}
});
} else {
setZoom({
pannable: false,
zoomable: false
});
}
});
function setZoom(obj) {
try {
$("#chart").data("kendoChart").setOptions(obj);
} catch (ex) {
$('#log').append($('<div/>').text("Error : " + ex.message + "\n" + ex.stack + "\n"));
}
}
</script>
</div>
</body>
</html>
在用户与复选框(左上角)交互时,使用框架中可用的 chart.setOptions() 方法设置图表的可缩放和平移属性。如果“运行 代码片段”不起作用,请按照以下步骤操作,您可以看到正在运行的错误。
第 1 步:将上面的代码片段复制到 http://dojo.telerik.com/ 的编辑器中 第 2 步:运行 代码。 (结果创建了一个图表)
第 3 步:勾选复选框以启用图表缩放。 (在 x 轴上设置了可缩放和平移属性,以便图表现在可以缩放和平移)
第 4 步:取消选中复选框以禁用图表缩放。 (pannable 被禁用,但图表仍然可以缩放。-这是错误)
第 5 步:再次勾选复选框,您将看到图表下方显示的错误。
如果有人知道如何解决这个问题。如果这是 KendoUI 的错误,那么希望 Kendo 开发团队得到这个。
这很奇怪,对于任何正在寻找解决方法的人来说,您可以使用阻止事件的默认值:
...
zoom: preventThisPlease,
dragStart: preventThisPlease,
...
function preventThisPlease(e) {
if (! document.getElementById('eq1').checked) {
e.preventDefault();
}
}
根据需要刷新复选框更改以重置缩放级别和平移位置:
$("#eq1").click(function(e) {
$("#chart").data("kendoChart").refresh();
});
更新:(更改图表配置选项)。 当我们尝试将 pannable 或 zoomable 设置为 false 时,问题似乎出现了。因此,根据使用 prevent default to disable pan/zoom 的解决方案,我们可以更改图表的选项。查看代码片段:
<!DOCTYPE html>
<html>
<head>
<base href="https://demos.telerik.com/kendo-ui/bar-charts/pan-and-zoom">
<style>
html {
font-size: 14px;
font-family: Arial, Helvetica, sans-serif;
}
</style>
<title></title>
<link rel="stylesheet" href="//kendo.cdn.telerik.com/2016.2.607/styles/kendo.common-material.min.css" />
<link rel="stylesheet" href="//kendo.cdn.telerik.com/2016.2.607/styles/kendo.material.min.css" />
<link rel="stylesheet" href="//kendo.cdn.telerik.com/2016.2.607/styles/kendo.default.mobile.min.css" />
<script src="//kendo.cdn.telerik.com/2016.2.607/js/jquery.min.js"></script>
<script src="//kendo.cdn.telerik.com/2016.2.607/js/kendo.all.min.js"></script>
</head>
<body>
<div id="example">
<div class="box wide">
<form class="chart-switch">
Restrict Pan & Zoom to:
<input type="radio" name="radio" id="eq1" class="k-radio">
<label class="k-radio-label" for="eq1">X</label>
<input type="radio" name="radio" id="eq2" class="k-radio">
<label class="k-radio-label" for="eq2">Y</label>
<input type="radio" name="radio" id="eq3" class="k-radio">
<label class="k-radio-label" for="eq3">X & Y</label>
<input type="radio" name="radio" id="eq4" class="k-radio" checked>
<label class="k-radio-label" for="eq4">None</label>
</form>
<p id="para">Use SHIFT + Mouse Drag Region Selection combination on mouse-enabled devices to zoom in data for a specific period of time</p>
</div>
<div class="demo-section k-content wide">
<div id="chart"></div>
<div id="log" style="
height: 120px;
overflow: scroll;
padding: 20px;
border: 1px solid black;">
</div>
</div>
<script>
// Sample data
var data = [];
for (var i = 0; i < 50; i++) {
var val = Math.round(Math.random() * 10);
data.push({
category: "C" + i,
value: val
});
}
function createChart() {
$("#chart").kendoChart({
renderAs: "canvas",
dataSource: {
data: data
},
categoryAxis: {
min: 0,
max: 10,
labels: {
rotation: "auto"
}
},
series: [{
type: "column",
field: "value",
categoryField: "category"
}],
zoom: preventThisPlease,
dragStart: preventThisPlease,
pannable: {
lock: "x"
},
zoomable: {
mousewheel: {
lock: "x"
},
selection: {
lock: "x"
}
}
});
}
$(document).ready(createChart);
$("#example").bind("kendo:skinChange", createChart);
// Disable Pan/Zoom
function preventThisPlease(e) {
if (document.getElementById('eq4').checked) {
e.preventDefault();
}
}
// Pan/Zoom options changing
$(".chart-switch input").on('change', function(e) {
// Get reference to the chart
var theChart = $("#chart").data("kendoChart");
// See which radio button is checked
var radioId = $(e.target).attr('id');
var toLock = "none";
switch(radioId) {
case "eq1":
toLock = "y";
break;
case "eq2":
toLock = "x";
break;
default:
toLock = "none";
}
try {
theChart.options.pannable.lock = toLock;
theChart.options.zoomable.mousewheel.lock = toLock;
theChart.options.zoomable.selection.lock = toLock;
theChart.refresh();
} catch (ex) {
$('#log').append($('<div/>').text("Error : " + ex.message + "\n" + ex.stack + "\n"));
}
});
</script>
</div>
</body>
</html>