You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

替代已废弃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,提问作者이희수

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 00:50:28