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

adding esri widget results in duplicate id error

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

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

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
    });
});

测量加载器:

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
        };
});

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

删除 MeasurementLoader.init() 调用也会删除错误,这表明我的代码正在导致第二次解析调用或正在生成重复的 ID。因为我的 DOM 只包含 "dijit_layout_ContentPane_0" 一次,所以我倾向于第一个选项。

我做错了什么?

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

好吧,我尝试解决它,ESRI 测量小部件似乎有问题。

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

更多详情请见下方截图-

但是,如果我们需要顶部的所有 dijit components 并将 parser.parse() 移到顶部,它会消除错误。

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

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

希望对您有所帮助:)

您收到的错误:

Error: Tried to register widget with id==dijit_layout_ContentPane_0 but that id is already registered

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

parseOnLoad true 指示 Dojo 在页面加载后将 dojo/parser 应用于整个正文。这是一种简单的方法,适用于页面主要包含小部件并且解析后不需要设置逻辑的情况。 然而,在实践中,许多应用程序需要在解析完成后将设置代码设置为 运行,而 parser.parse() 可能就是您所需要的。