随着我们对XPage版本9和Esri ARcgis javascript api v 3.5的更新,我们的dojo命名空间出现问题,导致了defineAlreadyDefined错误。这里列出了一些类似的问题(Using Durandal dojoConfig and ESRI Maps,How 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文件的错误位置。
答案 0 :(得分:3)
您需要记住几件事情,并可能相应地更改代码:
您可以做的是:
代码:
<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不是免费的,我认为最好的方式是联系他们,要求将ESRI部分API作为单独的下载,将其托管在您自己的服务器上,并遵循选项1或2.此外,您尝试使用的API版本基于Dojo 1.8.3,而Domino 9具有Dojo 1.8。
答案 1 :(得分: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脚本。