我有一个基于ESRI ArcGis Javascript api的应用程序,其中应添加measurement widget。 当我尝试启动此小部件时,我收到以下错误:
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可以重现问题。我删除了非必要位并将所有内容放在一个源文件中以使其更清晰。答案 0 :(得分:1)
好吧,我试图解决它,似乎ESRI Measurement小部件存在一些问题。
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"
我仍在尝试为此找到一些解决方法,我会在找到其他任何内容后立即更新。
希望这会对您有所帮助:)
答案 1 :(得分:0)
您收到的错误:
错误:尝试使用id == dijit_layout_ContentPane_0注册小部件 但该ID已经注册
表示您的应用程序中已存在另一个具有相同名称的ContentPane小部件。
parseOnLoad
true表示在加载页面后将dojo / parser应用于整个正文的Dojo。这是一种简单的方法,当页面主要包含小部件并且在解析后不需要设置逻辑时,它可以工作。
但实际上,许多应用程序需要在解析完成后运行设置代码,parser.parse()
可能是您需要的。