如何在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
相关产品推荐
相关产品推荐

