Power BI Deneb Vega定时器问题:currentTime无法实时更新求助
Deneb Vega脚本currentTime无法实时更新的解决方法
问题根源
- 数据未定时刷新:你在
data的transform里用了now(),但这个函数只会在数据集首次加载时执行一次,后续定时器更新timer信号不会触发数据重新计算,导致adjustedTime和currentTime一直停留在初始值。 - 标记属性未绑定动态更新:所有marks的encode都用了
enter类型,这只会在图形元素创建时设置属性,后续数据变化不会同步更新元素的位置和内容。
修复步骤
- 关联定时器与数据刷新:把
data转换逻辑里的now()替换成timer信号,让时间计算跟随定时器更新;同时给数据集添加on触发器,监听timer信号变化来触发数据重计算。 - 切换encode类型为update:把marks里动态变化的属性从
enter块移到update块,确保数据变化时图形元素能实时同步更新。 - 优化时间计算逻辑:调整时区偏移的计算依赖,确保
adjustedTime能正确基于定时器信号动态更新。
修复后的完整脚本
{ "$schema": "https://vega.github.io/schema/vega/v5.json", "width": 360, "height": 50, "signals": [ { "name": "timer", "value": now(), "on": [ { "events": {"type": "timer", "throttle": 1000}, "update": "now()" } ] } ], "data": [ { "name": "dataset", "on": [{"trigger": "timer", "update": "data('dataset')"}], "transform": [ { "type": "formula", "expr": "utcOffset('seconds', timer, datum.DST_ClockDiffBtwLocationAndLocalOffset)", "as": "adjustedTime" }, { "type": "formula", "expr": "hours(datum.adjustedTime) + minutes(datum.adjustedTime) / 60", "as": "currentTime" }, { "type": "formula", "expr": "hours(datetime(datum.SiteSupportStartFrom)) + minutes(datetime(datum.SiteSupportStartFrom)) / 60", "as": "startSupportTime" }, { "type": "formula", "expr": "hours(datetime(datum.SiteSupportDayTo)) + minutes(datetime(datum.SiteSupportDayTo)) / 60", "as": "endSupportTime" } ] } ], "scales": [ { "name": "xscale", "type": "linear", "domain": [0, 24], "range": [0, 350] } ], "marks": [ { "type": "rect", "from": {"data": "dataset"}, "encode": { "enter": { "y": {"value": 5}, "y2": {"value": 20}, "fill": {"value": "lightgreen"} }, "update": { "x": {"scale": "xscale", "field": "startSupportTime"}, "x2": {"scale": "xscale", "field": "endSupportTime"} } } }, { "type": "rule", "from": {"data": "dataset"}, "encode": { "enter": { "y": {"value": 0}, "y2": {"value": 27}, "stroke": {"value": "red"}, "strokeWidth": {"value": 2} }, "update": { "x": {"scale": "xscale", "field": "currentTime"} } } }, { "type": "text", "from": {"data": "dataset"}, "encode": { "enter": { "y": {"value": 8}, "fill": {"value": "black"}, "align": {"value": "center"}, "dy": {"value": -10} }, "update": { "x": {"scale": "xscale", "field": "currentTime"}, "text": {"signal": "timeFormat(datum.adjustedTime, '%H:%M')"} } } } ], "axes": [ { "orient": "bottom", "scale": "xscale", "tickCount": 24 } ] }
关键修改说明
- 将时间计算依赖从
now()改为timer信号,确保时间随定时器每秒更新 - 给
dataset添加触发器,监听timer变化触发数据重计算 - 把动态变化的属性(如红色标线位置、时间文本)移到
update块,实现实时同步
内容的提问来源于stack exchange,提问作者dgnoyon
相关产品推荐
相关产品推荐

