Javascript 隐藏AmChart4上的图例标签
我正在使用amchart折线图 我想在图表上隐藏图表图例标签 我很难找到与Javascript 隐藏AmChart4上的图例标签,javascript,amcharts,Javascript,Amcharts,我正在使用amchart折线图 我想在图表上隐藏图表图例标签 我很难找到与标签相关的项目 console.log(chart.legend.labels.values); console.log(chart.legend.labels.values.length)// somehow 0.... for (key in this.chart.legend.labels.values){ // it doesn't loop... this.chart.legend.labels.v
标签相关的项目
console.log(chart.legend.labels.values);
console.log(chart.legend.labels.values.length)// somehow 0....
for (key in this.chart.legend.labels.values){ // it doesn't loop...
this.chart.legend.labels.values[key].hide();
}
如何隐藏图例标签
简短的回答是:
chart.legend.labels.template.disabled=true;
演示:
了解这一点将有助于理解为什么这个答案有效,以及在需要迭代时如何使用像chart.legend.labels这样的对象
ListTemplate
基本上使用对象/类的实际实例作为它将生成的所有未来此类对象的模板,它将其存储在其template
属性中。是用于/的列表模板
默认情况下,图表的图例将引用图表的系列以自动生成图例项,它将克隆chart.legend.markers.template
和chart.legend.labels.template
,然后用系列的颜色/数据填充克隆。因此,如果原始标签是,它将是:
“隐藏,…从任何处理、布局计算中删除,通常被视为不存在。”
这就是我们想要的,因为.hide()
可以直观地隐藏文本,但仍然占据相同的空间(从CSS的角度考虑,这很像display:none
vsvisibility:hidden
)
上述过程是异步的。这就是为什么如果直接在源代码中运行代码,chart.legend.labels.values.length
,则返回0
,但如果稍后直接在控制台中运行,则返回预期的数字。如果要迭代图例项或标签,则必须等待它们被呈现,然后使用其方法(而不是通过值循环),例如:
在上面的代码中,我们等待图例本身获取其数据、解析和渲染,然后检查填充的标签,以了解我们想要做什么
通过预先使用模板
,我们完全忽略了异步性。如果要在事件发生后对所有图例标签应用设置,在chart.legend.labels.template
的情况下,它已设置为true
,因此,您可以在应用过程中随时在true
和false
之间切换chart.legend.labels.template.disabled
,每次它都会立即隐藏/显示图例的标签,相应地更新其布局。非常感谢@notacook!!它真的帮助我理解模板。现在chart.legend.markers.template.disabled
运行良好。然而,我有一个问题。当我触摸每个图例对象时,模板不可用,我需要等待图例渲染完成,对吗?。我的加载过程是1).制作图表类实例->2).通过Ajax加载数据->3)。将数据设置为图表和validateData()
。但是,inited
在进程1)中被调用。是否有任何方法或处理程序等待进程3)?另外,我想以您告诉我的方式循环标签和标记,如chart.legend.labels.each(函数(标签)和chart.legend.markers.each(函数(标签)。然后,我通过label.dataItem.component.dataFields.valueY检查标签名称。因为我有多个系列,它们具有不同的valueY和相同的valueX(日期)。但是label.dataItem.component.dataFields.valueY有值,marker.dataItem.component.dataFields.valueY没有值。(相反,marker.dataItem.dataContext.dataFields.valueY上有值)为什么这两种结构不同?好问题。你说得对,对于异步数据,“inited”
将在图例准备就绪后运行,即使数据尚未下降。您可以尝试该事件。也有事件。once
方法而不是事件。on
如果每次ajax调用只需要运行一次或唯一一次。如果“datavalidated”,您也可以尝试该事件
运行得太快了。我无法确切地说出这两者的不同之处,这很可能是因为标签涉及到神奇地提取字符串表示/显示的值,而不是在子项中。例如chart.legend.labels.getIndex(0).dataItem
实际上是系列1.dataItem
。标记与模拟其系列的外观/感觉/行为有关,并且更多地是图例的一部分,而不是其他任何内容。感谢您的解释。我试图更多地了解amchart的数据结构
chart.legend.events.on("inited", function() {
chart.legend.labels.each(function(label) {
// Do something related to this specific label
});
});