我正在尝试使用以下代码动态更改图表主题:
changeTheme(e) {
this.previewService.chartConfig.theme = this.themes[e.target.attributes.value.value];
}
这是我动态更改主题的方式,它反映在图表的json源中,但它没有更新实际主题。 你能告诉我一个有效的例子吗? 请检查这个小提琴。 https://jsfiddle.net/pshiral/30955m70/7/
答案 0 :(得分:5)
完全披露,我是ZingChart团队的成员。
主题在我们图书馆的最高层工作。我们根据主题中的属性以自上而下的方式构建图表的各个部分。因此,您只能在渲染级别设置和更新主题。这意味着您必须销毁图表并将其重新呈现为更改主题。请查看以下内容:
var myConfig = {
type: "bar",
series : [
{
values : [35,42,67,89,25,34,67,85]
}
]
};
zingchart.render({
id : 'myChart',
data : myConfig,
height: 400,
width: 600
});
function changeTheme(e) {
zingchart.exec('myChart','destroy');
zingchart.render({
id : 'myChart',
data : myConfig,
height : 400,
width : 600,
theme: this.id
});
}
document.getElementById('light').addEventListener('click',changeTheme);
document.getElementById('dark').addEventListener('click',changeTheme);
<!DOCTYPE html>
<html>
<head>
<script src= "https://cdn.zingchart.com/zingchart.min.js"></script>
<script> zingchart.MODULESDIR = "https://cdn.zingchart.com/modules/";</script>
</head>
<body>
<div id='myChart'></div>
<button id='light'>Light Theme</button>
<button id='dark'>Dark Theme</button>
</body>
</html>
答案 1 :(得分:2)
完全披露,我是ZingChart团队的成员。
我已更新我们的Angular Directive以监视zcRender对象的更改。它将负责图表清理并为您重新呈现图表。可以从github或npm下载最新版本1.2.1。我在plnkr中放了一个演示变化的小演示。
// If defaults or theme has changed.
// Destroy and re-render chart
$scope.$watch('zcRender', function(newValue, oldValue, scope) {
if(initializing.render){
initializing.render = !initializing.render;
return;
}
// console.log('---newValue',newValue)
// console.log('---oldValue',oldValue)
// console.log('---scope',scope)
zingchart.exec(scope.id, 'destroy');
scope.zcRender = newValue;
scope.renderChart();
},true);
// Break render function out of link so we can consistently
// call the same rendering algorithm
$scope.renderChart = function (){
var id = $element.attr('id');
//Defaults
var _json = {
data : {
type : 'line',
series : []
},
width : 600,
height: 400
};
//Add render object.
if($scope.zcRender){
mergeObject($scope.zcRender, _json);
}
//Add JSON object
if($scope.zcJson){
mergeObject($scope.zcJson, _json.data);
}
//Add Values
if($scope.zcValues){
injectValues($scope.zcValues, _json.data);
}
//Add other properties
_json.data.type = ($attrs.zcType) ? $attrs.zcType : _json.data.type;
_json.height = ($attrs.zcHeight) ? $attrs.zcHeight : _json.height;
_json.width = ($attrs.zcWidth) ? $attrs.zcWidth : _json.width;
_json.id = id;
//Set the box-model of the container element if the height or width are defined as 100%.
if(_json.width === "100%" && !$element.css('width')){
$element.css('width', '100%');
}
if(_json.height === "100%" && !$element.css('height')){
$element.css('height', '100%');
}
zingchart.render(_json);
}
答案 2 :(得分:0)
你需要使用默认值而不是主题:请检查附带的小提琴, 让我知道你看到的是同样的事情吗?
zingchart.render({
id : 'myChart',
data : $scope.data,
height : 300,
width : 500,
defaults: $scope.myTheme
});
https://jsfiddle.net/omix3379/4k0v06cL/
感谢。