替代已废弃map.watch():监听map.stationary变为True的实现方案
解决地图stationary状态变化触发函数的问题
你的Proxy代码问题分析
- 仅在**首次访问
proxy1.stationary**时触发get陷阱,地图内部更新stationary值时不会主动触发拦截逻辑 get陷阱未返回目标属性的实际值,会导致后续访问proxy1.stationary得到undefined,破坏原有业务逻辑
正确的Proxy实现方式
要监听stationary的状态变化,需要同时结合get和set陷阱,并且记录上一次的状态,避免状态未变更时重复触发:
// 记录上一次的stationary状态,过滤重复触发 let lastStationary = jmv.view.stationary; const viewProxy = new Proxy(jmv.view, { get(target, prop, receiver) { // 必须返回属性原始值,否则会影响地图原有功能 return Reflect.get(target, prop, receiver); }, set(target, prop, value, receiver) { if (prop === 'stationary') { // 仅当状态从false变为true时触发操作 if (!lastStationary && value) { console.log("地图已停止移动,执行指定操作"); // 在这里编写你的业务逻辑代码 } // 更新上一次的状态记录 lastStationary = value; } // 必须调用Reflect.set完成属性赋值,否则状态不会真正更新 return Reflect.set(target, prop, value, receiver); } }); // 注意:后续对地图视图的操作需使用代理对象viewProxy,而非原始的jmv.view // 若地图库内部更新状态不触发set操作,此方案可能失效,需换用官方事件方案
更可靠的替代方案:使用地图官方事件
多数地图库(从jmv.view推测可能为ArcGIS JS API这类)都提供了专门监听地图停止移动的事件,比Proxy更稳定——因为Proxy依赖属性的标准赋值流程,部分地图库的内部状态更新可能不走这个逻辑:
// 监听地图视图变化结束事件(不同库事件名可能不同,ArcGIS为"view-change-end") jmv.view.on("view-change-end", () => { // 额外确认stationary状态,避免中间状态误触发 if (jmv.view.stationary) { console.log("地图已停止移动,执行指定操作"); // 你的业务逻辑代码 } }); // 切换地图前需移除事件监听,避免重复绑定 // 示例: // jmv.view.removeAllListeners("view-change-end");
切换地图时的重复绑定解决
- Proxy方案:切换地图时销毁旧代理对象,避免内存泄漏和重复触发
- 事件方案:切换前调用
removeAllListeners或保存事件句柄,通过removeListener移除对应监听
内容的提问来源于stack exchange,提问作者이희수
相关产品推荐
相关产品推荐

