Javascript 隐藏AmChart4上的图例标签

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

我正在使用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.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
vs
visibility: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
    });
});