Javascript 使用ArcGIS JS API的dojo解析器和类型错误

Javascript 使用ArcGIS JS API的dojo解析器和类型错误,javascript,parsing,dojo,arcgis,Javascript,Parsing,Dojo,Arcgis,我得到了这个错误: TypeError:“undefined”不是函数(正在计算“parser.parse()”) 这是我的密码 <script> require([ "esri/map", "esri/layers/FeatureLayer", "esri/dijit/Legend", "esri/digit/HomeButton", "dojo/_base/array", "dojo/pars

我得到了这个错误:

TypeError:“undefined”不是函数(正在计算“parser.parse()”)

这是我的密码

<script> 
    require([
      "esri/map", 
      "esri/layers/FeatureLayer", 
      "esri/dijit/Legend",
      "esri/digit/HomeButton",
      "dojo/_base/array", 
      "dojo/parser",
      "dijit/layout/BorderContainer", 
      "dijit/layout/ContentPane", 
      "dijit/layout/AccordionContainer", 
      "dojo/domReady!"
], function(
  Map, FeatureLayer, Legend, arrayUtils, parser, HomeButton
) {
    parser.parse();

    var map = new Map("map", {
        basemap: "streets",
        center: [-87.702733, 41.998508],
        zoom: 15
    });

    var home = new HomeButton ({
        map: map
    }, "HomeButton");
    home.startup();

  var circuits = new FeatureLayer("http://54.243.188.50:6080/arcgis/rest/services/TYLIN/Streetlights_Pilot/MapServer/6", {
    mode: FeatureLayer.MODE_ONDEMAND,
    outFields:["*"]
  });

  var power = new FeatureLayer("http://54.243.188.50:6080/arcgis/rest/services/TYLIN/Streetlights_Pilot/MapServer/2", {
    mode: FeatureLayer.MODE_ONDEMAND,
    outFields:["*"]
  });


  //add the legend
  map.on("layers-add-result", function (evt) {
    var layerInfo = arrayUtils.map(evt.layers, function (layer, index) {
      return {layer:layer.layer, title:layer.layer.name};
    });
    if (layerInfo.length > 0) {
      var legendDijit = new Legend({
        map: map,
        layerInfos: layerInfo
      }, "legendDiv");
      legendDijit.startup();
    }
  });

  map.addLayers([circuits, power]);
});

</script>

要求([
“esri/map”,
“esri/图层/功能图层”,
“esri/dijit/Legend”,
“esri/数字/主页按钮”,
“dojo/_基/阵列”,
“dojo/parser”,
“dijit/layout/BorderContainer”,
“dijit/layout/ContentPane”,
“dijit/layout/AccordionContainer”,
“dojo/domReady!”
],功能(
地图、FeatureLayer、图例、arrayUtils、解析器、HomeButton
) {
parser.parse();
var map=新映射(“映射”{
基本地图:“街道”,
中心:[-87.702733,41.998508],
缩放:15
});
var home=新主页按钮({
地图:地图
}“主页按钮”);
home.startup();
var电路=新功能层(“http://54.243.188.50:6080/arcgis/rest/services/TYLIN/Streetlights_Pilot/MapServer/6", {
模式:FeatureLayer.mode\u ONDEMAND,
外场:[“*”]
});
var功率=新功能层(“http://54.243.188.50:6080/arcgis/rest/services/TYLIN/Streetlights_Pilot/MapServer/2", {
模式:FeatureLayer.mode\u ONDEMAND,
外场:[“*”]
});
//添加图例
map.on(“图层添加结果”,函数(evt){
var layerInfo=arrayUtils.map(evt.layers,函数(层,索引){
返回{layer:layer.layer,title:layer.layer.name};
});
如果(layerInfo.length>0){
var legendDijit=新图例({
地图:地图,
layerInfos:layerInfo
}“legendDiv”);
legendDijit.startup();
}
});
添加图层([电路,电源]);
});
我已经能够通过将HomeButton部分与图例部分分开来运行它。在comer中,我必须调用dojo.parser.parse()——但这不适用于图例部分


我不太理解dojo/解析器是如何工作的,所以我很难理解为什么有些部分需要dojo.parser.parse(),而另一些部分需要parser.parse()。

您的
require()
中存在问题
dojo/parser
是您导入的第6个模块,但是,
parser
的参数位于第5位,因此它们不匹配。导入的模块的顺序必须与在中使用的参数相同,因此这是正确的方法:

需要([
“esri/map”,
“esri/图层/功能图层”,
“esri/dijit/Legend”,
“esri/数字/主页按钮”,
“dojo/_基/阵列”,
“dojo/parser”,
“dijit/layout/BorderContainer”,
“dijit/layout/ContentPane”,
“dijit/layout/AccordionContainer”,
“dojo/domReady!”
],功能(
地图、FeatureLayer、图例、HomeButton、arrayUtils、解析器
) {
如您所见,我将HomeButton切换到另一个位置,现在模块与参数匹配

  • esri/map
    (第一个模块):
    map
    (函数中的第一个变量)
  • esri/layers/FeatureLayer
    (第二个模块):
    FeatureLayer
    (第二个参数)
  • esri/dijit/Legend
    (第三个模块):
    Legend
    (第三个参数)
  • esri/dijit/HomeButton
    (第四个模块):
    HomeButton
    (第四个参数)
  • dojo/\u base/array
    (第五个模块):
    arrayUtils
    (第五个参数)
  • dojo/parser
    (第六个模块):
    解析器
    (第六个参数)
如果将它们分开,那么代码可以工作的原因是您可能修复了
require()
dojo.parser.parse()
可以工作的原因是它是旧的不推荐使用的遗留代码,不使用
require
回调的参数