添加esri小部件会导致重复ID错误

时间:2017-05-29 13:55:11

标签: javascript dojo arcgis-js-api

我有一个基于ESRI ArcGis Javascript api的应用程序,其中应添加measurement widget。 当我尝试启动此小部件时,我收到以下错误:

  1. dojo / parser :: parse()error错误:尝试使用id == dijit_layout_ContentPane_0注册窗口小部件,但该ID已经注册
  2. 在_ContentSetter中解析错误#undefined错误:尝试使用id == dijit_layout_ContentPane_0注册小部件,但该ID已经注册
  3. 错误未定义运行自定义onLoad代码:此延迟已解决
  4. HTML:

    <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="title:'Measurement'">
        <div id="Measurement"></div>
    </div>
    

    JS:

    require(["esri/IdentityManager",
        "dojo/parser",
        "user/MeasurementLoader"
    ], function(parser, MeasurementLoader) {
        parser.parse();
        //bootstrap other stuff
    
        MeasurementLoader.init({
            map: map
        });
    });
    

    MeasurementLoader:

    define([
            "...",
    
        ],
        function(dom, ...) {
            esriConfig.defaults.geometryService = new GeometryService("http://ourarcgisserverurl");
    
            var
                sls = new SimpleLineSymbol("solid", new Color([195, 176, 23]), 2),
                sfs = new SimpleFillSymbol("solid", sls, null),
    
                init = function(options) {
                    var widget = new Measurement({
                        map: options.map,
                        fillSymbol: sfs,
                        lineSymbol: sls
                            //replace by options.container later on
                    }, dom.byId("Measurement"));
    
                    widget.startup();
                };
            return {
                init: init
            };
    });
    

    此错误的解决方案应该是通过设置data-dojo-config="parseOnLoad: false",加载arcgis库或删除parser.parse()来禁用parseOnLoad。但这两种解决方案都不起作用。

    删除MeasurementLoader.init()调用也会删除错误,这些错误表明我的代码导致了第二次解析调用或产生了重复的id。因为我的DOM只包含&#34; dijit_layout_ContentPane_0&#34;曾经,我赞成第一种选择。

    我做错了什么?

    编辑:Simplified JsFiddle可以重现问题。我删除了非必要位并将所有内容放在一个源文件中以使其更清晰。

2 个答案:

答案 0 :(得分:1)

好吧,我试图解决它,似乎ESRI Measurement小部件存在一些问题。

ID id==dijit_layout_ContentPane_0声称已注册,是由 esri measurement widget 本身动态生成的。

截屏下方了解更多详情 -

enter image description here

但是,如果我们要求顶部的所有dijit components并在顶部移动parser.parse(),则会删除错误。

"dijit/layout/BorderContainer"
"dijit/layout/ContentPane"
"dijit/layout/AccordionContainer"
"dijit/form/Button"
"dijit/form/TextBox"

我仍在尝试为此找到一些解决方法,我会在找到其他任何内容后立即更新。

希望这会对您有所帮助:)

答案 1 :(得分:0)

您收到的错误:

  

错误:尝试使用id == dijit_layout_ContentPane_0注册小部件   但该ID已经注册

表示您的应用程序中已存在另一个具有相同名称的ContentPane小部件。

parseOnLoad true表示在加载页面后将dojo / parser应用于整个正文的Dojo。这是一种简单的方法,当页面主要包含小部件并且在解析后不需要设置逻辑时,它可以工作。 但实际上,许多应用程序需要在解析完成后运行设置代码,parser.parse()可能是您需要的。