2017-05-29 1 views
0

J'ai une application ESRI ArcGis Javascript basée sur ESI, dans laquelle le measurement widget doit être ajouté. Lorsque je tente de démarrer ce widget, je reçois les erreurs suivantes:L'ajout d'un widget esri entraîne une erreur d'ID en double

  1. dojo/analyseur :: parse() Erreur Erreur: Essayé d'enregistrer id == widget avec dijit_layout_ContentPane_0 mais id est déjà enregistré
  2. erreur d'analyse dans _ContentSetter # Non défini erreur: Tentative d'enregistrement widget avec id == dijit_layout_ContentPane_0 mais id est déjà enregistré
  3. erreur non définie en cours d'exécution du code onLoad personnalisé: Ce report a déjà été résolu

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

La solution à cette erreur doit être invalidante soit parseOnLoad en définissant data-dojo-config="parseOnLoad: false", lors du chargement de la bibliothèque de arcgis, ou en enlevant parser.parse(). Mais aucune solution ne fonctionne.

La suppression de l'appel MeasurementLoader.init() supprime également les erreurs, ce qui indique que mon code provoque un second appel d'analyse ou produit un ID en double. Puisque mon DOM ne contient qu'une fois "dijit_layout_ContentPane_0", je privilégie la première option.

Qu'est-ce que je fais mal?

EDIT: Simplified JsFiddle qui reproduit le problème. J'ai supprimé les bits non essentiels et j'ai tout placé dans un fichier source pour le rendre plus clair.

+0

peut-être avez-vous d'autres données-dojo-type = "dijit/layout/ContentPane" dans votre application? –

+0

Oui bien sûr, beaucoup. N'était pas un problème avant – Marco

+0

Est-il possible de créer un exemple Jsfiddle ou n'importe où .. où nous pouvons reproduire la même erreur? –

Répondre

1

Eh bien, j'ai essayé de le résoudre et il semble qu'il y ait un problème avec le widget ESRI Measurement.

L'id id==dijit_layout_ContentPane_0 son prétendant que, il est enregistré qui est généré dynamiquement par esri measurement widget lui-même.

Ci-dessous capture d'écran pour plus Détails-

enter image description here

Cependant, il supprime l'erreur si nous avons besoin tous les dijit components sur le dessus et passer parser.parse() sur le dessus.

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

Je suis encore à essayer de trouver une solution de contournement pour cela, je mis à jour dès que je trouverai autre chose.

En espérant que cela vous aidera :)

+0

Il résout mon erreur pour le moment. Je suis également en train d'explorer la documentation de dojo, pour savoir pourquoi les exigences résolvent cette erreur. – Marco

+0

j'ai observé dans quelques autres échantillons (surtout dans les échantillons ESRI) - Partout où vous devez "analyser" sur le dessus et vous devez exiger tous les composants en haut que vous utilisez en HTML ... - btw merci d'avoir accepté (y) Content de vous aider :) –

0

L'erreur que vous recevez:

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

indique que un autre widget de ContentPane avec le même nom existe déjà dans votre application.

parseOnLoad true indique que Dojo doit appliquer dojo/parser à tout le corps après le chargement de la page. Cette approche est simple et fonctionne lorsque la page contient principalement des widgets et qu'aucune logique d'installation n'est requise après l'analyse. En pratique, cependant, de nombreuses applications requièrent un code de configuration à exécuter une fois l'analyse terminée et parser.parse() est probablement ce dont vous avez besoin.