2

I am trying to use the Esri ArgGis JavaScript API, which is loaded by Dojo, using dojo.require. I have an existing modular AMD/requirejs Typescript application that I need to integrate this code into. At the top of my initial TS file, I import several modules:

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

This was working fine, but now that I have added the ArcGis code, instead of resolving the relative path within my application, require.js has picked up a baseUrl from the Esri site, and tries to load:

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

Resulting in a string of 404 responses and script errors.

How can I fix this?

I've tried setting the requirejs baseUrl in the head of my html file before loading the first document that loads modules:

 <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>

But this fails, throwing an exception that require has no method config.

(NB If I reverse the order in the head of the html document so that the arcgis api comes last in the load sequence then I get the opposite problem - my local files all work fine but dojo and the mapping api fail because they are looking for paths relative to my site when they should be searching on the argis server).

4

2 回答 2

6

我使用 Esri 的 ArcGIS API,所以我遇到了这个确切的问题。 dojo 的这篇博文帮助了我一些。

第一个问题是 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"
        }
    ]
};

这样做是将基本路径设置回当前 url 加上您的额外内容,然后告诉 dojo esri 的内容在哪里。这些是我遇到的所有包,但如果我错过了一个依赖项,因为它从未为我加载,它需要一个类似的条目。

您可能遇到的另一个问题是,如果您习惯于在本地以 file:// 加载脚本,那么现在来自另一个域的 dojo 将尝试访问 file://,而浏览器将立即关闭它。从现在开始,您需要在本地 http 服务器上进行测试。在 Windows 上我更喜欢HFS,而在 Linux 上python 让它变得简单

我希望这有帮助。

于 2013-03-13T16:24:47.137 回答
1

require()由于两者之间的冲突,我在使用 dojo 和 requirejs 时遇到了几个问题。你应该看看 dojo bug 15616。您可能想查看来自 google 组的这个线程,其中 James 建议使用所有 dojo 或所有 requirejs。

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

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

于 2013-03-13T16:15:52.980 回答