Oracle APEX Map Region 初始位置与缩放配置二次访问失效问题
问题根因分析
- 页面项会话状态配置异常:你使用的
P17_GPS_LATITUDE、P17_GPS_LONGITUDE两个页面项,默认配置为「仅提交时保留值」,首次加载时会话状态存在有效值,第二次进入页面时会话状态被清空,SQL查询返回空值,地图组件读取到空的经纬度参数时会自动丢弃该字段,同时触发容错逻辑把缩放值兜底为0。 - 地图组件缓存机制冲突:Oracle APEX 20.2及以上版本的地图区域默认会将初始化配置缓存到浏览器会话存储,
resetMapPosition参数默认不会写入持久化缓存,第二次加载时组件优先读取缓存配置,直接覆盖了SQL查询返回的参数值。 - 渲染时序错位:如果你的经纬度页面项是通过动态行动态赋值的,地图初始化SQL的执行时机早于动态行赋值时机,SQL读取到空值就会导致参数丢失。
解决方案
- 调整页面项存储配置:将两个经纬度页面项的「值保留规则」从「仅提交时保留」修改为「会话级别始终保留」,如果是全局通用参数可改为应用级项,避免页面跳转后值丢失。
- 强制覆盖地图初始化配置:在地图区域的「高级→自定义初始化函数」中添加如下代码,跳过缓存强制读取最新页面项值:
function(options) { options.resetMapPosition = true; options.initPosition = { basedOnFeatures: false, lon: parseFloat(apex.item("P17_GPS_LONGITUDE").getValue()), lat: parseFloat(apex.item("P17_GPS_LATITUDE").getValue()), zoom: 15, getFromBrowser: false }; return options; }
- 调整SQL增加非空兜底:避免空值触发组件容错逻辑,可修改原有SQL为:
select nvl(to_number(:P17_GPS_LATITUDE), 45.97590926950204) as LAT, nvl(to_number(:P17_GPS_LONGITUDE), 1.8246315941379123) as LON, 15 as ZOOM from DUAL
- 调整动态行执行时机:如果经纬度为动态赋值,将赋值动态行的触发时机改为「页面加载前(Before Header)」,确保SQL执行前页面项已经有有效值;或者关闭地图的「页面加载时自动渲染」,待经纬度赋值完成后调用
apex.region("localitzacioMapa").refresh()手动刷新地图。
内容的提问来源于stack exchange,提问作者Fabià Figueras
相关产品推荐
相关产品推荐

