3

次のエラーが表示されます。

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>

HomeButton パーツを Legend パーツとは別に分割することで、これを実行することができました。最後に、dojo.parser.parse() を呼び出さなければなりませんが、それは Legend 部分では機能しません。

私は dojo/parser がどのように機能するかをよく理解していないので、dojo.parser.parse() が必要な部分と parser.parse() が必要な部分がある理由を理解するのは困難です。

4

1 に答える 1

6

に問題がありますrequire()dojo/parserはインポートするモジュールの 6 番目ですが、名前の付いたパラメーターparserは 5 番目にあるため、一致しません。インポートするモジュールの順序は、それらを使用するパラメーターと同じでなければならないため、これが正しい方法です。

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, HomeButton, arrayUtils, parser
) {

ご覧のとおり、HomeButton を別の場所に切り替えたところ、モジュールがパラメーターと一致するようになりました。

  • esri/map(1 番目のモジュール): Map(関数内の 1 番目の変数)
  • esri/layers/FeatureLayer(2 番目のモジュール): FeatureLayer(2 番目のパラメーター)
  • esri/dijit/Legend(3 番目のモジュール): Legend(3 番目のパラメーター)
  • esri/dijit/HomeButton(4 番目のモジュール): HomeButton(4 番目のパラメーター)
  • dojo/_base/array(5番目のモジュール): arrayUtils(5番目のパラメータ)
  • dojo/parser(6 番目のモジュール): parser(6 番目のパラメーター)

それらを分離した場合にコードが機能する理由は、おそらくrequire(). 機能する理由は、コールバックdojo.parser.parse()のパラメーターを使用しない古い非推奨のレガシー コードであるためです。require

于 2013-10-10T22:22:52.273 に答える