我有一个关于使用
option
与 setOption()
进行 getModel()
更新的问题。
用
getModel()
考虑此代码:
const optionSeries = myChart.getModel().option.series[0];
optionSeries.axisLabel.color = "#f00";
myChart.setOption(optionSeries);
还有这个
setOption()
:
myChart.setOption({
series: [
{
axisLabel: "#f00"
}
]
});
myChart.setOption(option);
还有这个
getOption()
:
const option = myChart.getOption();
option.series[0].axisLabel.color = "#f00";
myChart.setOption(option);
根据
getOption()
文档:
另外,不推荐以下款式:
var option = myChart.getOption();
option.visualMap[0].inRange.color = ...;
myChart.setOption(option);
这是因为 getOption 包含合并值,这些值可能是默认值,并且可能与未来值重叠。所以,我们在更新部分配置时推荐以下风格。
我想知道使用
getModel()
是否与使用 getOption()
一样有害,或者您可以正常使用 setOption
而不受到限制或惩罚吗?
此外,使用
getModel()
是否有任何其他限制,即避免使用它的理由?
ECharts#getModel()
和 Model
类,以及它们下面的任何内容都是未记录的,
因此不应该在用户空间中访问。
您可以查看 echarts 文件的 typescript 类型定义 您在上一篇文章中提到过。你可以看到
Echarts#getModel
(第 2554 行)被标记为 private
,这说明了开发人员的很多信息
echarts 的思考是被用户访问的。
我们通过研究获得有关这些方法和类的信息
源代码并通过检查您的数据结构
代码在控制台中创建。主要问题是
您通过这种方式发现的任何有关“未记录”功能的信息
在 echarts 库的任何未来更新中可能会发生变化,恕不另行通知。
因此,您要么将代码绑定到特定版本的 echarts,要么,
理论上,每当有小更新时,你都必须重复
您的事实收集程序,以确保您的结构
所依赖的代码仍然有效。
至于Model#option
Model#getOption
),理论上它呈现的是 与
Echarts#getOption
相同的危险:无法保证选项对象 要完全深度克隆,因此通过分配一个值 deep 在实时选项对象内,您可以更改默认值 属性,不愿意影响当前添加的新系列 图表或其他图表实例。作为一个非必要的观察,在实践中,我未能创建一个 两者都没有发生这种情况的示例
Echarts#getOption
,也不是Model#option
,甚至不是
visualMap
的例子 您引用的文档中概述的内容不会产生任何结果 不需要的副作用。该系列型号
defaultOptions
有 已加载(请参阅Series.ts#L264
) 通过
zrender#merge
使用 zrender#clone
,
两者都对对象数组结构执行完全递归深度复制,如下所示
选项是。只有 Date
没有被克隆,但我不知道有什么默认设置
Date
.
形式的选项无论如何,警告仍然存在,因为开发人员无意 确保没有混淆,因此设置选项
Echarts#setOption
以及 Model#setOption
应该更好地使用 新鲜的物体,而不是通过
getOption
方法获得的活的物体。