dojo.require 语句未按预期加载 esri Map 模块

Posted

技术标签:

【中文标题】dojo.require 语句未按预期加载 esri Map 模块【英文标题】:dojo.require statement is not loading esri Map module as expected 【发布时间】:2015-06-16 10:24:18 【问题描述】:

我正在开发一个使用“arcgis”API 加载地图的 php 应用程序。请在下面找到网址:

http://js.arcgis.com/3.11/

为了在我的应用程序中加载 arcgis 地图,我必须使用

dojo.require("esri.map");

所以在我的单页 PHP 应用程序中,我添加了如下的 require 语句:

<script type="text/javascript">
   dojo.require("esri.map");
</script>

并且在我给的一个js文件中加载了如下图:

var myOptions = 
                        maxZoom: 20,
                        minZoom: 3,
                        zoom:5,
                        isZoomSlider: false,
                        sliderStyle: "large",
                        sliderPosition: "top-right"             
                    ;
        this.map = new esri.Map("mapDiv", myOptions);

但是当我运行这个应用程序时,我在“this.map = new esri.Map("mapDiv", myOptions);”这一行收到一条错误消息“Uncaught TypeError: undefined is not a function”

如果我打开开发人员工具,通过在 require 和 esri.Map 语句处保留断点来运行相同的代码,我可以看到地图正在加载。但是,如果我在不打开开发人员工具的情况下运行它,那么我将面临这个问题。

为什么 dojo.require 语句没有按预期工作? 我在做什么错?? 请回复

【问题讨论】:

【参考方案1】:

您正在尝试使用旧模块要求加载地图模块。尝试使用 AMD 语法的 require Map,如 docs 所示: require(["esri/map"], function(Map) /* code goes here */ );

【讨论】:

我也试过了这段代码在一个视图中。所以我做了下面的 在视图中,我使用了以下代码: this.map = new mapAssign ("mapDiv", myOptions);在这样做时,我遇到了同样的问题,因为 require 函数没有首先命中。相反,地图初始化首先击中。 我制作了一个sample,带有主干视图和您可以查看的 esri 地图。我建议您了解有关 AMD 的更多信息here【参考方案2】:

您需要将 JavaScript 代码封装在对 dojo.ready 的调用中。

html 文件:

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no">
    <title>JavaScript in Separate File</title>

    <link rel="stylesheet" href="http://js.arcgis.com/3.11/dijit/themes/claro/claro.css">
    <link rel="stylesheet" href="http://js.arcgis.com/3.11/esri/css/esri.css">
    <style>
      html, body  height: 100%; width: 100%; margin: 0; padding: 0; 
      #mapDivpadding:0;
    </style>

    <script>var dojoConfig = parseOnLoad: true;</script>
    <script src="//js.arcgis.com/3.11/"></script>
    <script src="code.js"></script>
    <script>
      dojo.require("esri.map");
      dojo.require("esri.layers.agstiled");
    </script>
  </head>
  <body class="claro" >
    <div id="mapDiv"></div>
  </body>
</html>

code.js 文件:

dojo.ready(function()  
  var myOptions = 
                  maxZoom: 20,
                  minZoom: 3,
                  zoom:5,
                  isZoomSlider: false,
                  sliderStyle: "large",
                  sliderPosition: "top-right"             
              ;
  this.map = new esri.Map("mapDiv", myOptions);
  var layer = new esri.layers.ArcGISTiledMapServiceLayer(
    "http://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer");
  this.map.addLayer(layer);
);

【讨论】:

以上是关于dojo.require 语句未按预期加载 esri Map 模块的主要内容,如果未能解决你的问题,请参考以下文章

动态脚本标签加载未按预期工作

std::find 条件语句未按预期工作

EF6,延迟加载未按预期工作

Hue 上的 Apache Pig 0.12.0 未按预期预处理语句

解决了| Python:If/elif/else 语句未按预期工作?

Sql 语句:在要插入的字段中未指定主键时,插入键更新未按预期工作