我该如何修复此AND路径冲突?

时间:2013-03-13 13:10:11

标签: javascript requirejs typescript arcgis amd

我正在尝试使用Esri ArgGis JavaScript API加载Dojo,使用dojo.require。我有一个现有的模块化AMD/requirejs Typescript应用程序,我需要将此代码集成到其中。在我的初始TS文件的顶部,我导入了几个模块:

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>

但是这失败了,抛出一个需要没有方法配置的异常。

(NB如果我颠倒了html文档头部的顺序,以便arcgis api在加载序列中排在最后,那么我遇到了相反的问题 - 我的本地文件都工作正常,但是dojo和映射api失败了因为它们他们应该在argis服务器上搜索时,正在寻找相对于我的网站的路径。)

2 个答案:

答案 0 :(得分:6)

我使用Esri的ArcGIS API,所以我遇到了这个问题。来自dojo的This博客文章帮助了我。

第一个问题是dojo的配置方式与requirejs不同。它寻找一个先前定义的dojoConfig进行设置。第二个是Esri的模块加载是在假定一个基本路径的情况下设置的,而你的代码将需要另一个。你将需要一个看起来像这样的dojo配置:

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"
        }
    ]
};

这样做是将basepath设置回当前url加上你的额外东西,然后告诉dojo esri的东西在哪里。这些都是我遇到的所有软件包但是如果有一个依赖项我错过了,因为它从来没有为我加载过,它需要一个类似的条目。

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

我希望这会有所帮助。

答案 1 :(得分:1)

由于两者之间存在require()冲突,我在使用dojo和requirejs时遇到了一些问题。你应该看一下dojo bug 15616。您可能希望查看来自Google群组中的thread,其中James建议所有道场或所有必需品。

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

如果您的问题是由baseUrl冲突导致的404错误,则解决方法是创建.d.ts文件,该文件将../classes/trace之类的路径别名化并将其替换为路径有效(绝对或其他)。