Arcgis(ESRI)dojo使用jQuery的定义导致组件具有multiDefine

bry*_*yan 5 javascript jquery dojo amd arcgis

我希望在ArcGIS Web应用程序中包含由某人编写的组件。

但是,当包含在内时,我总是会在控制台窗口中遇到一个multipleDefine问题。

有两种解决方法,即将以下脚本移动到组件下方。

<script src="https://js.arcgis.com/3.14/"></script>
Run Code Online (Sandbox Code Playgroud)

或通过在脚本上声明延迟

<script defer src="https://js.arcgis.com/3.14/"></script>
Run Code Online (Sandbox Code Playgroud)

但是这些并不能解决问题的根源,因为基本上该组件将不会使用AMD而是使用浏览器全局声明它

你们有什么主意吗?我在其中包含了一个jsFiddle:

https://jsfiddle.net/h9ztsrm3/5

只需打开控制台窗口,您就可以看到multipleDefine问题,谢谢!

为简单起见,我还包含了另一个jsFiddle,它不使用arcgis dojo AMD,但使用requirejs AMD,虽然结果问题有所不同,但任何有关此问题的解决方案也可能会解决这里的主题。

https://jsfiddle.net/w33zwjhx/


以下是更多信息:

1)我正在尝试使用带有bootstrap 3的asp.net mvc 5来生成带有arcgis映射的Web应用程序

2)asp.net mvc 5默认会添加以下脚本标记

<script src="/Scripts/jquery-2.1.4.js"></script>
<script src="/Scripts/bootstrap.js"></script>
Run Code Online (Sandbox Code Playgroud)

3)我继续将地图集成到我的应用程序中

<script src="/Scripts/esri/3.14/init.js"></script>
Run Code Online (Sandbox Code Playgroud)

4)步骤3将隐式启动dojo,因为arcgis与dojo耦合

5)我找到了可以在互联网上使用的优秀组件,并继续进行集成

https://github.com/ehpc/bootstrap-waitingfor/blob/master/src/waitingfor.js

<script src="/Scripts/ehpc/waitingdialog/src/js/waitingdialog.js"></script>
Run Code Online (Sandbox Code Playgroud)

6)但是该组件具有以下代码,并且由于dojo已通过arcgis加载,因此将执行if语句的内容

if (typeof define === 'function' && define.amd) {
    define(['jquery'], function ($) {
        return (root.waitingDialog = factory($));
    });
}
Run Code Online (Sandbox Code Playgroud)

7)我现在按照jsFiddle遇到了问题

8)我研究了解更多,但是以下网站告诉我define(['jquery'])是编写组件的正确方法

http://ifandelse.com/its-not-hard-making-your-library-support-amd-and-commonjs/

Ken*_*iro 1

我不清楚你在这里真正想要做什么,但似乎你在该小提琴的 HTML 窗格中添加的代码中创建了自己的问题。

如果 jQuery 是在 AMD 加载器存在的情况下加载的,则它已经将自己定义为 AMD 模块。如果您第二次加载 jQuery,则以下内容将起作用,因为 jQuery 恰好使用静态模块 ID 定义自身:

<script src="https://js.arcgis.com/3.14/"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script>
    require([ 'jquery' ], function ($) { ... });
</script>
Run Code Online (Sandbox Code Playgroud)

(尽管jQuery$仍将在全球范围内注册。)

直接通过 AMD 加载器加载 jQuery 的更理想方法如下:

<script>
    var dojoConfig = {
        async: true,
        paths: {
            jquery: 'https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min'
        }
    };
</script>
<script src="https://js.arcgis.com/3.14/"></script>
<script>
    require([ 'jquery' ], function ($) { ... });
</script>
Run Code Online (Sandbox Code Playgroud)