You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ThingsBoard速度仪表组件onDataUpdated中访问gauge.value?

问题

需要修改ThingsBoard的「Speed gauge(速度仪表)」组件,使其在满足特定条件时显示0值,操作需在onDataUpdated()函数中执行。

该组件继承自TbAnalogueRadialGauge类,其update()方法实现如下:

update() {
    if (this.ctx.data.length > 0) {
      const cellData = this.ctx.data[0];
      if (cellData.data.length > 0) {
        const tvPair = cellData.data[cellData.data.length -1];
        const value = tvPair[1];
        if (value !== this.gauge.value) {
          this.gauge.value = value;
        }
      }
    }
  }

TbAnalogueRadialGauge继承自TbAnalogueGauge,后者又继承自实现了update()方法的TbBaseGauge。

从代码看,该方法通过this.gauge.value更新仪表值,但在组件开发IDE中尝试访问该属性时返回undefined:

self.onDataUpdated = function() {
    self.ctx.gauge.update();
    console.log(self.ctx.gauge.value) // output: undefined
}

请问如何正确访问该属性?

解决方法
  • 确认gauge实例的层级
    TbAnalogueRadialGauge类内部的this.gauge是私有属性,你通过self.ctx.gauge访问的是父类实例,并非持有value的最终仪表对象。正确路径应为self.ctx.gauge.gauge.value——子类内部的gauge才是实际渲染的仪表实例。

  • 直接在onDataUpdated中处理值逻辑
    无需依赖访问gauge.value,可以先获取数据源的值,判断条件后直接修改:

self.onDataUpdated = function() {
    let targetValue = null;
    // 复刻父类update方法的取值逻辑
    if (self.ctx.data.length > 0) {
      const cellData = self.ctx.data[0];
      if (cellData.data.length > 0) {
        const tvPair = cellData.data[cellData.data.length -1];
        targetValue = tvPair[1];
      }
    }
    // 自定义条件,比如值为空/小于0时设为0
    if (targetValue === null || targetValue < 0) {
      targetValue = 0;
    }
    // 更新仪表值并刷新
    self.ctx.gauge.gauge.value = targetValue;
    self.ctx.gauge.update();
}
  • 验证属性结构
    若不确定层级,可通过console.log(self.ctx.gauge)打印父类实例,查看内部结构确认最终仪表实例的属性名——部分版本中可能是radialGauge而非gauge,打印后能明确正确路径。

内容的提问来源于stack exchange,提问作者Tecnicos Computrol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 03:05:21