在添加 K 线时,即使 shiftVisibleRangeOnNewBar 为 false,订阅可见逻辑范围变化的处理程序也会自行调用自己
作者: Moriropi创建于 2026年9月10日更新于 2026年9月10日
Lightweight Charts™ 版本:
步骤/代码以便重现问题:
this.#chart.applyOptions({
// 选项,防止在最后一条柱状图可见时,新柱状图的可见范围发生移动
// 在 subscribeVisibleLogicalRangeChange 之外,此选项可以正常工作
shiftVisibleRangeOnNewBar: false,
});
// 可见逻辑范围变化的处理程序
const handler = (logicalRange) => {
// 获取图表中最后两条 Kline 的副本
const lastTwo = [ {
time: this.#klines.at(-1).time + 24 * 3600,
open: this.#klines.at(-1).open,
high: this.#klines.at(-1).high,
low: this.#klines.at(-1).low,
close: this.#klines.at(-1).close
}, {
time: this.#klines.at(-2).time + 24 * 3600 * 3,
open: this.#klines.at(-2).open,
high: this.#klines.at(-2).high,
low: this.#klines.at(-2).low,
close: this.#klines.at(-2).close
} ];
// 添加最后两条 Kline 的副本
this.#klines = [ ... this.#klines, ... lastTwo ];
// 取消订阅(如果不取消订阅,handler 将在无限循环中被调用)
this.#chart.timeScale().unsubscribeVisibleLogicalRangeChange(handler);
// 设置 Kline 数据 // 还会将逻辑范围向右移动 <-- 如何防止此情况发生?
this.#seriesKline.setData(this.#klines);
// 使用 update() 而不是 setData() 具有相同的效果
// this.#seriesKline.update(lastTwo[1]);
// 重新订阅
this.#chart.timeScale().subscribeVisibleLogicalRangeChange(handler);
};
// 订阅
this.#chart.timeScale().subscribeVisibleLogicalRangeChange(handler);实际行为:
当手动向左滚动图表时:可见逻辑范围会向右移动,并且由于添加了 Kline 而略有跳跃。
内容来源: tradingview/lightweight-charts