dojo 添加esri微件导致重复ID错误

slhcrj9b  于 2022-12-20  发布在  Dojo
关注(0)|答案(2)|浏览(193)

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

  1. dojo/parser::解析()错误错误尝试注册id == dijit_layout_ContentPane_0的小工具,但该id已注册
    1.在_ContentSetter #中分析时出错未定义错误:尝试注册id == dijit_layout_ContentPane_0的小工具,但该id已注册
    1.运行自定义onLoad代码时发生未定义错误:此延迟已解决
    网址:
<div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="title:'Measurement'">
    <div id="Measurement"></div>
</div>

联森:

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"来禁用parseOnLoad,或者通过删除parser.parse()来禁用parseOnLoad。
删除MeasurementLoader.init()调用也会删 debugging 误,这些错误表明我的代码正在引起第二次解析调用或正在生成重复的id。由于我的DOM只包含"dijit_layout_ContentPane_0"一次,因此我倾向于第一个选项。
我哪里做错了?
编辑:Simplified JsFiddle重现了这个问题。我已经删除了不必要的部分,并把所有的东西放在一个源文件中,使它更清楚。

watbbzwu

watbbzwu1#

嗯,我试图解决它,它似乎有一些问题与ESRI测量小部件。
id id==dijit_layout_ContentPane_0声称,它是由**esri measurement widget**本身动态生成的注册。
以下屏幕截图了解更多详情-

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

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

尽管如此,我正在努力找到一些变通办法,这一点,我会更新,只要我会找到其他任何东西。

希望这对你有帮助:)

a6b3iqyw

a6b3iqyw2#

您收到的错误:
错误:尝试注册id==dijit_layout_ContentPane_0的小部件,但该id已注册
表示应用程序中已存在另一个同名的ContentPane小部件。
parseOnLoad true表示Dojo在加载页面后将dojo/parser应用于整个正文。这是一种简单的方法,适用于页面主要包含小部件且解析后不需要设置逻辑的情况。但实际上,许多应用程序需要在解析完成后运行设置代码,而parser.parse()可能正是您所需要的。

相关问题