【问题标题】:XPages 9 with Esri maps dojo conflict: 'defineAlreadyDefined'XPages 9 与 Esri 地图 dojo 冲突:'defineAlreadyDefined'
【发布时间】:2013-07-18 02:43:47
【问题描述】:

随着我们对 XPages 版本 9 和 Esri ARcgis javascript api v 3.5 的更新,我们的 dojo 命名空间出现问题,导致出现 defineAlreadyDefined 错误。此处列出了一些类似的问题(Using Durandal dojoConfig and ESRI MapsHow can I fix this AMD path conflict?),但即使有这些帮助,我们也无法使其正常工作。我相信问题是 dojoConfig 语法 - 任何想法或帮助将不胜感激!

这里是我们的带有 js 的 xpage 源代码的简单版本:

<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:this.resources>
 <xp:styleSheet
  href="http://serverapi.arcgisonline.com/jsapi/arcgis/3.5/js/dojo/dijit/themes/claro/claro.css">
 </xp:styleSheet>
 <xp:styleSheet
  href="http://serverapi.arcgisonline.com/jsapi/arcgis/3.5/js/esri/css/esri.css">
 </xp:styleSheet>
 <xp:script clientSide="true">
 // dojo.registerModulePath("esri","http://serverapi.arcgisonline.com/jsapi/arcgis/3.5/js/esri");

 dojoConfig = {
  baseUrl: "http://serverapi.arcgisonline.com/jsapi/arcgis/3.5/js/esri", 
  packages: [
   {
    name: 'dojo',
    location: "http://serverapi.arcgisonline.com/jsapi/arcgis/3.5/js/dojo/dojo/"
   },
   {
     name: 'dojox',
     location: "http://serverapi.arcgisonline.com/jsapi/arcgis/3.5/js/dojo/dojox"
   },
   { 
     name: 'esri',
     location: "http://serverapi.arcgisonline.com/jsapi/arcgis/3.5/js/esri"
    }
   ]};
 </xp:script>
  <xp:script src="http://serverapi.arcgisonline.com/jsapi/arcgis/3.5/"
            clientSide="true">
  </xp:script>    
  <xp:dojoModule name="esri.map"></xp:dojoModule>
 </xp:this.resources>
 <xp:eventHandler event="onClientLoad" submit="false">
    <xp:this.script><![CDATA[var map;
    function init(){
     var map = new esri.Map("mapDiv", {
        center: [-56.049, 38.485],
        zoom: 3,
        basemap: "streets"
      });
    }
    dojo.ready(init);

   ]]></xp:this.script>

如果我们包含 dojo.registerModulePath 命令,地图会加载(至少在 FF 中),但会出现错误。没有它,esri dojo 将无法加载 - 它在错误的位置查找 esri 文件。

【问题讨论】:

  • 如果从包中删除 dojo 和 dojox 会发生什么? XPages 已经加载了 dojo/dojox(除非你禁用它)

标签: dojo xpages esri


【解决方案1】:

好的,这对我来说也是个问题! 我已经能够通过使用以下代码使其工作:

    <xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:this.resources>
        <xp:script clientSide="true">
            dojo.registerModulePath("esri","http://js.arcgis.com/3.8/js/esri");
            dojoConfig = { baseUrl: "http://js.arcgis.com/3.8/js/esri",
            packages: [ { name: 'esri', location: "http://js.arcgis.com/3.8/js/esri" } ]};
        </xp:script>
        <xp:styleSheet href="http://js.arcgis.com/3.8/js/esri/css/esri.css" />
        <xp:styleSheet href="http://js.arcgis.com/3.8/js/esri/dijit/css/Popup.css" />
  <xp:dojoModule name="esri.map"></xp:dojoModule>
    </xp:this.resources>
    <xp:eventHandler event="onClientLoad" submit="false">
        <xp:this.script><![CDATA[var map;
    function init(){
     var map = new esri.Map("mapDiv", {
        center: [0,53],
        zoom: 10,
        basemap: "streets"
      });
    }
    dojo.ready(init);

   ]]></xp:this.script>
    </xp:eventHandler>
    <div id="mapDiv" style="width:1000px;height:600px"></div>
    </xp:view>

我认为脚本的顺序很重要,您不需要包含两次 esri.map 脚本。

【讨论】:

    【解决方案2】:

    您需要记住几件事,并可能相应地更改代码:

    • xPages 已经通过 xsp-config 使用了 dojoconfig
      文件选项或使用 xPages 参数。
    • 正如 Per 所说,dojo 已在 xPages 中使用,因此您无需从其他地方加载它(同样适用于 CSS)。

    您可以执行以下操作:

    • 选项 1:使用 JS 库的离线副本制作地图。您可以添加它们 到您的 xPages 应用程序作为 JS 资源。您只需指定 它们在您的 xPage 中,并像您一样加载 dojo 模块;
    • 选项 2:见下文如何在 xPage 加载之前注入更多 dojoConfig 选项

    代码:

    <xp:this.properties>
        <xp:parameter name="xsp.client.script.dojo.djConfig" value="packages: exPackages" />
    </xp:this.properties>
    <xp:this.beforePageLoad>
        <![CDATA[#{javascript:
            var exCon = facesContext.getExternalContext();
            var response = exCon.getResponse();
            var writer = response.getWriter();
            writer.write("<script>\n");
            writer.write("var exPackages=[{name:'esri',location:'http://serverapi.arcgisonline.com/jsapi/arcgis/3.5/js/esri'}]\n");
            writer.write("</script>\n");
            }]]>
    </xp:this.beforePageLoad>
    <xp:this.resources>
        <xp:dojoModule name="esri.map"></xp:dojoModule>
    </xp:this.resources>
    

    更新:代码的小修正。

    Update2:在简要检查了 ArcGis 网站后,他们似乎选择将 Dojo 与他们的 API 一起提供(我认为这是错误的)。请参阅https://developers.arcgis.com/en/javascript/jshelp/inside_dojoversion.html(第 2 部分),尽管它对您没有多大帮助,因为它们没有为 Dojo 1.8.x 提供可行的解决方案

    看到他们的 API 不是免费的,我认为最好的方式是与他们联系,要求单独下载 API 的 ESRI 部分,将其托管在您自己的服务器上并遵循选项 1 或 2。此外,您尝试使用的 API 版本基于 Dojo 1.8.3,而 Domino 9 具有 Dojo 1.8。

    【讨论】:

    • 感谢您的帮助!我们也向 ESRI 提交了一张票,但他们无法弄清楚如何重新映射或提供没有嵌入 dojo 的 API 版本。正如您所说,它也不是完全相同的版本,尽管 xpages 可能与 1.8.3 一起工作得很好。我们将尝试使其与您的选项 2 一起使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多