2013-03-13 89 views
2

我正在尝试使用由Dojo加载的使用dojo.requireEsri ArgGis JavaScript API。我有一个现有的模块AMD/requirejs Typescript应用程序,我需要将此代码集成到。在我最初的TS文件的顶部,我输入几个模块:我该如何解决这个AMD路径冲突?

import tracer = module('../classes/trace'); 
import pubsub = module('../classes/pubsub'); 
import masker = module('../classes/masker'); 
// etc. 

这是工作的罚款,但现在,我已经添加了ArcGIS的代码,而不是解决我的应用程序中的相对路径,require.js有拿起从ESRI的网站的baseUrl,并试图加载:

http://serverapi.arcgisonline.com/jsapi/arcgis/3.3/js/esri/classes/trace.js 
// etc. 

在404个响应和脚本错误的字符串由此而来。

我该如何解决这个问题?

我试图加载,加载模块的头文件之前设置在我的HTML文件的头部requirejs的baseUrl:

<script src="http://serverapi.arcgisonline.com/jsapi/arcgis/3.3"></script> 
<script type="text/javascript" src="/content/client/libs/require.js"></script> <!-- data-main="/content/client/hop/hop.app" --> 
<script type="text/ecmascript"> 
     require.config({ 
      baseUrl: "/Content/client/hop/" 
     }); 
</script> 
<script src="~/Content/client/hop/hop.app.js"></script> 

但这种失败,投掷要求没有方法配置一个例外。 (注意:如果我颠倒了html文档头部的顺序,以便arcgis api在加载顺序中最后出现,我得到了相反的问题 - 我的本地文件一切正常,但dojo和映射API失败,因为当他们应该在argis服务器上搜索时,他们正在寻找相对于我的网站的路径)。

回答

6

我使用Esri的ArcGIS API,因此遇到了这个问题。 This来自dojo的博客文章帮助我解决了一些问题。

第一个问题是dojo的配置方式与requirejs的配置方式不同。它寻找一个先前定义的dojoConfig来设置。第二个是Esri的模块加载全部设置为假设一个基本路径,并且您的代码将要另一个。你会需要一个道场的配置看起来是这样的:

dojoConfig = { 
    baseUrl: location.pathname.replace(/\/[^/]+$/, '') + '/Content/client/hop/', // magic! 
    packages: [ 
     { 
      name: 'dojo', 
      location: "http://serverapi.arcgisonline.com/jsapi/arcgis/3.3compact/js/dojo/dojo/" 
     }, 
     { 
      name: 'dojox', 
      location: "http://serverapi.arcgisonline.com/jsapi/arcgis/3.3compact/js/dojo/dojox" 
     }, 
     { 
      name: 'esri', 
      location: "http://serverapi.arcgisonline.com/jsapi/arcgis/3.3compact/js/esri" 
     } 
    ] 
}; 

这是什么东西做的是设置基本路径返回到当前的URL加上你的额外的东西,然后告诉道场其中ESRI的东西。这些都是我遇到过的所有软件包,但如果我错过了一个依赖项,因为它从来没有加载过我,它需要一个类似的条目。

您可能遇到的另一个问题是,如果您习惯在本地将文件加载为file://现在另一个域的dojo将尝试访问file://并且浏览器将关闭该文件向下。从现在开始,您需要在本地http服务器上进行测试。在Windows上,我更喜欢HFS和Linux python makes it easy

我希望这会有所帮助。

+0

谢谢Jeffrey - 这真的很有用。我已经将地图放入iframe中,以便在截止日期前完成,但我会在下周尝试一下,并接受它是否有效。 – JcFx 2013-03-13 18:26:25

1

由于两者之间存在require()冲突,我使用dojo和requirejs有几个问题。你应该看看道场臭虫15616。您可能需要从James小组提供的所有道场或所有requirejs的谷歌小组中查看此thread

我不确定您使用的dojo版本是什么版本,但是从源代码检查,因为requirejs/dojo的相关更改不在发布版本1.8中。

如果您只有问题引起的baseUrl冲突的解决方法是创建一个.d.ts文件别名的路径一样../classes/trace并与工作的路径(绝对或以其他方式)将其替换404错误。

+0

谢谢,瑞安 - 有用的信息。 – JcFx 2013-03-13 18:26:50