lightweight charts中如何正确取消CrosshairMove订阅并保留事件参数e?
问题根源
你当前代码无法正确取消订阅的核心原因有两个:
- 取消订阅时传递的
this.subCrossAndSync()是执行函数后的返回值,而非之前订阅的事件处理器函数本身; - 订阅时使用了匿名箭头函数,每次重新订阅都会生成全新的函数实例,没有保存旧的函数引用,导致
unsubscribeCrosshairMove找不到要移除的目标。
解决方案
要实现正确的取消订阅,你需要保存每次订阅的事件处理器引用,而非使用匿名函数。具体步骤如下:
- 在类的实例中维护一个变量,用于存储当前生效的十字线移动事件处理器:
// 在类的构造函数或初始化逻辑中添加 this.currentCrosshairHandler = null;
- 更新订阅/取消订阅的逻辑,先移除旧处理器,再创建并保存新处理器的引用,最后完成订阅:
// 取消旧订阅(如果存在) if (this.currentCrosshairHandler) { this.mainChart.unsubscribeCrosshairMove(this.currentCrosshairHandler); } // 创建新的处理器函数并保存引用 this.currentCrosshairHandler = (e) => this.subCrossAndSync(e, this.midChart, seriesData); // 订阅新的处理器 this.mainChart.subscribeCrosshairMove(this.currentCrosshairHandler);
补充说明
- 这种方式通过保存函数引用,确保
unsubscribeCrosshairMove能精准找到需要移除的事件处理器; - 箭头函数在这里的作用是保证
subCrossAndSync内部的this指向当前类实例,同时保留对事件参数e的访问; - 如果不想用箭头函数,也可以通过
bind绑定上下文,但同样需要保存绑定后的函数引用:
// 绑定上下文和固定参数,保存引用 this.currentCrosshairHandler = this.subCrossAndSync.bind(this, null, this.midChart, seriesData); // 订阅 this.mainChart.subscribeCrosshairMove(this.currentCrosshairHandler);
(注意:bind的参数是前置传递,这里第一个null占位对应事件参数e,后续才是你的自定义参数)
内容的提问来源于stack exchange,提问作者willbeing
相关产品推荐
相关产品推荐

