2017-05-29 92 views
0

我有一個現有的基於ESRI ArcGis Javascript api的應用程序,其中應該添加measurement widget。 當我嘗試啓動這個小工具收到以下錯誤:添加esri小部件導致重複的id錯誤

  1. 道場/解析器解析::()error錯誤:試圖與ID插件註冊== dijit_layout_ContentPane_0但ID已被註冊
  2. 在_ContentSetter#未定義的錯誤錯誤分析:嘗試與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 
    }); 
}); 

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一次只包含「dijit_layout_ContentPane_0」,所以我贊成第一個選項。

我在做什麼錯?

編輯:Simplified JsFiddle它再現了問題。我刪除了非必要的位,並將所有內容放在一個源文件中以使其更清晰。

+0

可能你有其他的data-dojo-type =「dijit/layout/ContentPane」在你的應用程序中? –

+0

當然,很多。在 – Marco

+0

之前沒有問題可以創建一個示例Jsfiddle或任何地方..我們可以在哪裏重現相同的錯誤? –

回答

1

好吧,我試圖解決它,它似乎有一些ESRI測量小部件的問題。

其編號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" 

我仍然試圖找到一些解決方法,我會盡快找到其他的解決方法。

希望這將幫助你:)

+0

它現在確實解決了我的錯誤。我也通過dojo文檔爬行,找出爲什麼需求解決這個錯誤。 – Marco

+0

我在少數其他示例中觀察過(大部分在ESRI示例中) - 無論您需要在頂部「解析」哪個位置,都必須要求使用HTML中頂部的所有組件......--順帶感謝您接受(y)很高興幫助你:) –

0

錯誤您收到:

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()可能是您需要的。