javascript - ThingsBoard 动态更改简单卡片小部件元素的背景颜色

标签 javascript dynamic colors widget thingsboard

在我的 ThingsBoard 仪表板中,我有一个简单的卡片小部件元素。我想根据发送的值动态更改此元素的背景颜色。

enter image description here

有人知道如何实现这种行为吗?

非常感谢。

最佳答案

您需要创建一个自定义小部件才能执行此操作。您只需保存简单的卡片小部件即可创建它的可编辑副本。

在这个新的小部件中,您可以像这样更改小部件的背景颜色:

self.ctx.$container[0].style.backgroundColor = "#ff0000";

默认情况下,小部件元素具有内容容器的填充。您可以在小部件设置中将该填充设置为零,以使容器填充整个小部件区域。

每当数据更新时,都会调用小部件回调onDataUpdated(),您可以在其中根据您的值实现颜色更改。这是简单卡片小部件的实现。我添加了背景颜色的更新(值 < 0 为红色,值 > 0 为绿色)。

self.onDataUpdated = function() {
    
    function isNumber(n) {
        return !isNaN(parseFloat(n)) && isFinite(n);
    }

    if (self.ctx.valueCell && self.ctx.data.length > 0) {
        var cellData = self.ctx.data[0];
        if (cellData.data.length > 0) {
            var tvPair = cellData.data[cellData.data.length -
                1];
            var value = tvPair[1];
            var txtValue;
            if (isNumber(value)) {
                var decimals = self.ctx.decimals;
                var units = self.ctx.units;
                if (self.ctx.datasources.length > 0 && self.ctx.datasources[0].dataKeys.length > 0) {
                    dataKey = self.ctx.datasources[0].dataKeys[0];
                    if (dataKey.decimals || dataKey.decimals === 0) {
                        decimals = dataKey.decimals;
                    }
                    if (dataKey.units) {
                        units = dataKey.units;
                    }
                }

                // Change background color to red (v<0) or green (v>=0)
                self.ctx.$container[0].style.backgroundColor = value > 0 ? "#00ff00" : "#ff0000";
                
                txtValue = self.ctx.utils.formatValue(value, decimals, units, true);
            } else {
                txtValue = value;
            }
            self.ctx.valueCell.html(txtValue);
            var targetWidth;
            var minDelta;
            if (self.ctx.labelPosition === 'left') {
                targetWidth = self.ctx.datasourceContainer.width() - self.ctx.labelCell.width();
                minDelta = self.ctx.width/16 + self.ctx.padding;
            } else {
                targetWidth = self.ctx.datasourceContainer.width();
                minDelta = self.ctx.padding;
            }
            var delta = targetWidth - self.ctx.valueCell.textWidth();
            var fontSize = self.ctx.valueFontSize;
            if (targetWidth > minDelta) {
                while (delta < minDelta && fontSize > 6) {
                    fontSize--;
                    self.ctx.valueCell.css('font-size', fontSize+'px');
                    delta = targetWidth - self.ctx.valueCell.textWidth();
                }
            }
        }
    }    
    
};

关于javascript - ThingsBoard 动态更改简单卡片小部件元素的背景颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67805780/

相关文章:

javascript - 从另一个 Javascript 文件调用一个 Javascript 文件中的函数?

R:shapefile 上的梯度图

javascript - 如何在 JavaScript 中显示双引号

javascript - 输入 5 个字符时执行的按键事件

javascript - 从 CountDown 子项中 react 设置状态

javascript - 如何舍入 Javascript x 和 y 坐标的值

函数内的 JavaScript 通过变量名调用函数

JavaFX、TableView、编辑后动态更新Item

html - 更改文本区域中动态项目的字体颜色 Spotfire

ios - NavBar 的颜色与背景颜色不同