2013-07-18 72 views
1

隨着我們對XPages版本9和Esri ARcgis javascript api v 3.5的更新,我們遇到了導致defineAlreadyDefined錯誤的dojo命名空間問題。這裏列出了一些類似的問題(Using Durandal dojoConfig and ESRI Maps,How can I fix this AMD path conflict?),但即使有這種幫助,我們也無法使其工作。我相信這個問題是dojoConfig語法 - 任何想法或幫助將不勝感激!XPage 9與Esri映射dojo衝突:'defineAlreadyDefined'

下面是一個簡單的版本,我們的XPage源代碼JS:

<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文件的錯誤位置。

+0

如果從包中刪除dojo和dojox,會發生什麼情況?XPages已經加載了dojo/dojox(除非你禁用它) –

回答

0

好的,這對我來說也是個問題! 我已經能夠得到它通過使用下面的代碼工作:

<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腳本。

3

有你需要記住,並可能相應地更改代碼幾件事情:

  • 的XPages已經利用dojoconfig的,無論是通過XSP-配置
    文件的選項或使用XPages中的參數。
  • 正如Per提到的,dojo已經在xPages中使用,所以你不需要從別的地方加載它(同樣適用於CSS)。

你可以做的是以下幾點:

  • 選項1:JS庫的地圖中使用離線副本。您可以將它們 作爲JS資源添加到您的xPages應用程序。你只需要在你的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(第二部分),雖然它不會幫助你,因爲它們沒有爲Dojo 1.8.x提供可行的解決方案。

看到他們的API不是免費的,我認爲最好的方法是聯繫他們,要求將ESRI的部分API作爲單獨下載,將其託管在自己的服務器上,並遵循選項1或2.此外,您嘗試使用的API版本基於Dojo 1.8.3,而Domino 9具有Dojo 1.8。

+0

感謝您的幫助!我們也使用了ESRI的門票,他們也無法弄清楚如何重新映射或提供沒有嵌入dojo的API版本。正如你所說,它也不是完全相同的版本,雖然xpages可能在1.8.3下工作得很好。我們將嘗試使其與您的選項2一起工作。 –