Javascript 是否更新所有Chart.js实例以应用更改的默认值? 情况:

Javascript 是否更新所有Chart.js实例以应用更改的默认值? 情况:,javascript,html5-canvas,chart.js,default,Javascript,Html5 Canvas,Chart.js,Default,我目前正在集成一个动态黑暗主题功能,需要根据主题的变化更改默认设置。它看起来像这样(高度简化): 函数变更主题(暗主题=false){ 如果(暗色){ document.body.classList.add('dark-theme'); Chart.defaults.global.defaultFontColor='白色'; }否则{ document.body.classList.remove('dark-theme'); Chart.defaults.global.defaultFontCo

我目前正在集成一个动态黑暗主题功能,需要根据主题的变化更改默认设置。它看起来像这样(高度简化):

函数变更主题(暗主题=false){
如果(暗色){
document.body.classList.add('dark-theme');
Chart.defaults.global.defaultFontColor='白色';
}否则{
document.body.classList.remove('dark-theme');
Chart.defaults.global.defaultFontColor='黑色';
}
}

问题: 页面上的现有图表不会立即应用更改的默认设置。仅在进行更新时(例如,在工具提示上、更改数据、调整画布大小)

我可以通过调用chart的instance方法手动更新图表。但我无法访问所有现有的图表对象(无法访问创建它们的脚本的作用域),也无法找到全局获取它们的方法


问题:
  • 有没有办法在没有图表实例的情况下强制更新所有图表
  • 或者:有没有办法让所有图表实例都更新
  • 或者:这是一个问题,有没有一种方法可以解决这个问题
  • 我已经对上述问题之一的答案感到满意了


    重现问题的示例: 显示并运行代码段。点击“toggleDarkTheme”按钮,然后点击“#投票数”或其他按钮触发更新

    //为主题设置函数
    函数更改主题(暗主题=假){
    如果(暗色){
    document.body.classList.add('dark-theme');
    Chart.defaults.global.defaultFontColor='白色';
    }否则{
    document.body.classList.remove('dark-theme');
    Chart.defaults.global.defaultFontColor='黑色';
    }
    }
    改变主题(假);
    //切换主题的按钮
    设暗色反应=假;
    document.getElementById('toggleDarkTheme')。addEventListener('click',()=>{
    darkThemeActive=!darkThemeActive;
    变更主题(暗色反应性);
    });
    /*示例图表,假装您没有访问此范围的权限;)*/
    {
    const ctx=document.getElementById('myChart').getContext('2d');
    常量myChart=新图表(ctx{
    类型:'bar',
    数据:{
    标签:[“红色”、“蓝色”、“黄色”、“绿色”、“紫色”、“橙色”],
    数据集:[{
    标签:“#投票数”,
    数据:[12,19,3,5,2,3],
    背景颜色:[
    "rgba(255,99,132,0.2)",,
    “rgba(54162235,0.2)”,
    "rgba(255,206,86,0.2)",,
    “rgba(751921920.2)”,
    “rgba(153102255,0.2)”,
    ‘rgba(255、159、64、0.2)’
    ],
    边框颜色:[
    "rgba(255,99,132,1)",,
    “rgba(54162235,1)”,
    "rgba(255,206,86,1)",,
    "rgba(751921921)",,
    "rgba(153102255,1)",,
    ‘rgba(255、159、64、1)’
    ],
    边框宽度:1
    }]
    },
    选项:{
    回答:对
    }
    });
    document.getElementById('TriggermanUpdate')。addEventListener('click',()=>{
    myChart.update();
    });
    }
    按钮{
    背景色:#eee;
    颜色:rgba(0,0,0,0.87);
    边界:无;
    边界半径:3px;
    填充:0.5雷姆;
    }
    .黑暗主题{
    背景色:#212121;
    颜色:白色;
    }
    .黑色主题按钮{
    背景色:#212121;
    颜色:白色;
    }
    
    切换暗线
    三锗碘酸盐
    
    您可以使用
    chart.instances
    对象动态循环图表实例。例如:

    Chart.helpers.each(Chart.instances, function(instance){
      instance.chart.update();
    });
    
    我修改了下面的示例,以更新切换函数中的所有图表。您会注意到字体颜色现在随着切换而改变

    //为主题设置函数
    函数更改主题(暗主题=假){
    如果(暗色){
    document.body.classList.add('dark-theme');
    Chart.defaults.global.defaultFontColor='白色';
    }否则{
    document.body.classList.remove('dark-theme');
    Chart.defaults.global.defaultFontColor='黑色';
    }
    //强制更新所有图表
    Chart.helpers.each(Chart.instances,function(instance){
    instance.chart.update();
    });
    }
    改变主题(假);
    //切换主题的按钮
    设暗色反应=假;
    document.getElementById('toggleDarkTheme')。addEventListener('click',()=>{
    darkThemeActive=!darkThemeActive;
    变更主题(暗色反应性);
    });
    /*示例图表,假装您没有访问此范围的权限;)*/
    {
    const ctx=document.getElementById('myChart').getContext('2d');
    常量myChart=新图表(ctx{
    类型:'bar',
    数据:{
    标签:[“红色”、“蓝色”、“黄色”、“绿色”、“紫色”、“橙色”],
    数据集:[{
    标签:“#投票数”,
    数据:[12,19,3,5,2,3],
    背景颜色:[
    "rgba(255,99,132,0.2)",,
    “rgba(54162235,0.2)”,
    "rgba(255,206,86,0.2)",,
    “rgba(751921920.2)”,
    “rgba(153102255,0.2)”,
    ‘rgba(255、159、64、0.2)’
    ],
    边框颜色:[
    "rgba(255,99,132,1)",,
    “rgba(54162235,1)”,
    "rgba(255,206,86,1)",,
    "rgba(751921921)",,
    "rgba(153102255,1)",,
    ‘rgba(255、159、64、1)’
    ],
    边框宽度:1
    }]
    },
    选项:{
    回答:对
    }
    });
    }
    按钮{
    背景色:#eee;
    颜色:rgba(0,0,0,0.87);
    边界:无;
    边界半径:3px;
    填充:0.5雷姆;
    }
    .黑暗主题{
    背景色:#212121;
    颜色:白色;
    }
    .黑色主题按钮{
    背景色:#212121;
    颜色:白色;
    }
    
    切换暗线