在添加 K 线时,即使 shiftVisibleRangeOnNewBar 为 false,订阅可见逻辑范围变化的处理程序也会自行调用自己

作者: Moriropi创建于 2026年9月10日更新于 2026年9月10日

Lightweight Charts™ 版本:

步骤/代码以便重现问题:

javascript
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