在我的代码中使用ArcGIS API for JavaScript v4.4时,我遇到了这个奇怪的问题。我正在尝试构建一个Excel Web加载项,我想在其中加载ArcGIS地图,但是当我加载ArcGIS时,我收到multipleDefine错误。
ArcGIS与Dojo捆绑在一起,{{3}}用作所有ArcGIS / esri包的加载程序。由于ArcGIS构建API的方式,我没有其他选择可以使用Dojo加载我自己的自定义JS包。所以我决定不使用Dojo,因此不会出现multipleDefine
错误。
我加载了我自己的JS文件:
<script src="https://appsforoffice.microsoft.com/lib/1/hosted/office.js" type="text/javascript"></script>
<script>
var dojoConfig = {
parseOnLoad: false,
async: false,
// we make aliases for our js file
aliases: [
['index', './Bundles/index.js'],
],
};
</script>
<script src="https://js.arcgis.com/4.4/init.js"></script>
<script>
require(['index'], function (index) {
//...do something
});
</script>
当我重新启动页面时,每两到三次试验就会出现一次multipleDefine
错误。经过大量调查后,我了解到错误在于Office.js API,但我很难找到一个好的解决方案。
答案 0 :(得分:0)
过了一会儿,我找到了问题的原因;我们无法一起启动office-js和Dojo,因为他们都希望在我们页面的head标签中添加脚本,并且它们最终会彼此冲突,因此我们得到了可怕的multipleDefined Dojo错误,而我们的一些文件没有得到加载。
一旦确定了这个原因,我决定通过确保在Office和依赖项完全加载后加载Dojo,Argis和我的自定义js文件来解决它。
我在我的js代码中实现了这个:
// This Dojo config variable has to be defined before Dojo is loaded in our scripts
var dojoConfig = {
// we make aliases for our custom js file
aliases: [
['index', './Bundles/index.js'],
],
// We require our dependencies (our own code bundles) with Dojo.
// Notice that it is mandatory to bundle our js files
// as AMD Modules for Dojo to be able to load them as dependencies.
deps: ['index'],
};
// Once office has fully initialized we can add our arcgis file and let
// him load our own required javascript files.
// We cannot start Office-js and Dojo/Arcgis together because they both
// want to add scripts in the head tag of the HTML page and
// somehow they end up in conflict, thus we get the dreaded
// multipleDefined Dojo error and some of our files
// do not get loaded.
Office.initialize = function (reason) {
// we manually add the Arcgis script to the header of our page
// once we are sure Office and dependencies has fully loaded.
var tag = document.createElement('script');
tag.src = 'https://js.arcgis.com/4.4/init.js';
document.getElementsByTagName('head')[0].appendChild(tag);
};
添加完成后,代码就像魅力一样开始工作。