dojo 如何在要求回调之外访问ArcGIS JavaScript API?

i5desfxk  于 2022-12-16  发布在  Dojo
关注(0)|答案(1)|浏览(215)

我试图弄清楚如何在require之外(ArcGIS JS API使用Dojo)从渲染后的Map访问ArcGIS JS API。例如,这样我就可以在Map上添加(或删除)点,并执行其他操作。
我可以按如下方式创建Map:

require(["esri/config", "esri/Map", "esri/views/MapView", "esri/Graphic",
      "esri/layers/GraphicsLayer"
    ], function(esriConfig, Map, MapView, Graphic, GraphicsLayer) {
      esriConfig.apiKey = "";
      const map = new Map({
        basemap: "arcgis-topographic"
      });
      const view = new MapView({
        map: map,
        center: [-81, 41],
        zoom: 9,
        container: "viewDiv"
      });
});

我可以用这个函数添加一个点:

function plotPoint(lat, long, props) {
    const popupTemplate = {
        title: "{Name}",
        content: "{Description}"
    }
    
    const attributes = {
        Name: props.name,
        Description: props.desc
    }
    
    const graphicsLayer = new GraphicsLayer();
    map.add(graphicsLayer);
    
    const point = {
        type: "point",
        longitude: long,
        latitude: lat
    };
  
    const simpleMarkerSymbol = {
        type: "simple-marker",
        color: [226, 119, 40],
        outline: {
          color: [255, 255, 255],
          width: 1
        }
    };
    
    const pointGraphic = new Graphic({
        geometry: point,
        symbol: simpleMarkerSymbol,
        attributes: attributes,
        popupTemplate: popupTemplate
    });
  
    graphicsLayer.add(pointGraphic);
}

但是plotPoint需要在require回调函数中,这样它才能访问引用的模块(如GraphicsLayer)。我可以将它赋给全局window对象,这样我就可以在require之外调用它,但这样我可能会遇到函数在定义之前被调用的问题。
我可能还需要从代码中的其他点执行其他操作,如删除点、添加特征层等。不幸的是,这些操作必须全部存在于某些遗留代码中,因此我无法重构整个应用程序。
是否有更好的模式可以访问require之外的API?

lawou6xi

lawou6xi1#

如果我理解正确的话,我认为实现所需功能的最简单方法就是定义模块并将其包含在应用程序中。
基于代码一个简单示例如下所示,

图形管理器.js

define([
    "dojo/_base/declare",
    "esri/Graphic",
    "esri/layers/GraphicsLayer"
], function(declare, Graphic, GraphicsLayer){
    return declare(null, {
        plotPoint: function(lat, long, props){
            // .. here the logic
            return graphicsLayer;
        }
    });
});

主文件.js

require(["esri/config", "esri/Map", "esri/views/MapView", "app/GraphicsManager"
    ], function(esriConfig, Map, MapView, GraphicsManager) {
      esriConfig.apiKey = "";
      const map = new Map({
        basemap: "arcgis-topographic",
      });
      const view = new MapView({
        map: map,
        center: [-81, 41],
        zoom: 9,
        container: "viewDiv"
      });
      // ... some logic to get the point data
      const gm = new GraphicsManager();
      map.add(gm.plotPoint(lat, long, props));
      // .. some other logic
});

您可以看到main.js是应用程序启动的地方,在那里或其他模块中设置了一些内容。例如,Map、图层、小部件等。然后,您可以在模块中创建其他代码,并根据需要使用import。
dojotoolkit - intro to modules

相关问题