JavaScript中如何在filteredValue变量值变化时触发执行指定操作?
实现方案
你可以通过在事件回调外部声明一个变量存储slicer的历史取值,每次触发rendered事件时对比当前值和历史值,仅当二者不一致时执行指定操作即可,完整修改后的代码如下:
// 全局作用域声明变量存储上一次的slicer取值,初始值设为null let lastFilteredValue = null; report.on('rendered', async () => { // 获取所有页面 const pages = await report.getPages() // 获取当前激活页面 let activePage = pages.filter(function(page) { return page.isActive })[0]; // 获取激活页面上的所有可视化组件 let visuals = await activePage.getVisuals(); // 匹配目标slicer组件 const TargetVisual = visuals.filter(function(visual) { return visual.name === "259fea6751434e7910b4" })[0]; // 异常兼容:找不到目标组件时直接终止执行,避免报错 if (!TargetVisual) return; // 获取slicer当前状态 const state = await TargetVisual.getSlicerState(); // 获取当前开关状态(ON/OFF对应的值) let filteredValue = state.filters[0].values; // 对比当前值与历史值,注意引用类型需要序列化对比内容 const currentValue = JSON.stringify(filteredValue); const lastValue = JSON.stringify(lastFilteredValue); if (currentValue !== lastValue) { // -------------------------- // 此处填写你要执行的业务代码 // -------------------------- console.log('切换器状态发生变化,最新值为:', filteredValue); // 执行完成后更新历史值 lastFilteredValue = filteredValue; } })
补充说明
- 用
JSON.stringify做序列化对比是因为Power BI返回的state.filters[0].values通常为数组格式,比如ON状态对应[true]、OFF状态对应[false],数组属于引用类型,直接用===对比会校验内存地址而非内容,即使值一致也会返回false,序列化后对比内容更稳妥。 - 如果你确认你的切换器返回的
filteredValue是布尔值而非数组,可以直接去掉序列化步骤,直接对比filteredValue !== lastFilteredValue即可。 - 代码中新增了目标组件不存在的兼容逻辑,避免页面切换导致slicer未加载时报错。
内容的提问来源于stack exchange,提问作者Gangrel
相关产品推荐
相关产品推荐

