Javascript 动态加载Dojo包
我正在设置一个映射应用程序,无法理解部分工作流程。我正在使用ESRI的JSAPI,它使用Dojo back。我从数据库中提取数据,并将其加载到一个隐藏字段中,以便在加载时进行解析 当我想设置Dojo加载哪些包时,我的问题就来了。我有包名和包URL,我正试图让它们动态加载。但我还需要能够使用这些包来创建新对象,如地图层对象 我有一个初始的Javascript 动态加载Dojo包,javascript,dynamic,dojo,packages,esri,Javascript,Dynamic,Dojo,Packages,Esri,我正在设置一个映射应用程序,无法理解部分工作流程。我正在使用ESRI的JSAPI,它使用Dojo back。我从数据库中提取数据,并将其加载到一个隐藏字段中,以便在加载时进行解析 当我想设置Dojo加载哪些包时,我的问题就来了。我有包名和包URL,我正试图让它们动态加载。但我还需要能够使用这些包来创建新对象,如地图层对象 我有一个初始的require语句,用于加载映射本身: require(["application/bootstrapmap", "dojo/domReady!"],
require
语句,用于加载映射本身:
require(["application/bootstrapmap", "dojo/domReady!"],
function (BootstrapMap) {
// Get a reference to the ArcGIS Map class
map = BootstrapMap.create("map", {
basemap: "national-geographic",
center: [-122.45, 37.77],
zoom: 12,
scrollWheelZoom: true,
});
});
然后,我希望能够根据配置数据库表动态加载不同的包。我想我可以做一些类似的事情:
$.each(packages, function (index, iPackage) {
var packageURL = iPackage["PackageURL"];
var packageName = iPackage["PackageName"];
dojo.config.packages.push({ location: packageURL, name: packageName });
});
或者我的另一个尝试是:
$.each(packages, function (index, iPackage) {
var packageURL = iPackage["PackageURL"];
var packageName = iPackage["PackageName"];
require([locationURL], function(packageName){});
});
我基本上是想找到一种方法,首先加载一个map对象,然后通过插入页面的JSON进行解析,动态添加层。我只想加载我需要的,而不是加载所有不同的模块,只是挑选和选择以后使用的模块。我宁愿马上装载和使用
我正在寻找任何建议,让这样的设置工作。首先,即使你可能实现你想要的,我也不推荐这样做。对我来说,这是一个错误的设计,因为一旦你已经知道需要哪些模块,为什么你需要参数化它 其次,仅供参考,请确保在加载dojo.js本身之前(或在引用几乎是dojo包的esri库之前),已设置了dojoConfig和包URL。在引用config对象后,您不能设置或修改该对象的任何其他属性 假设这应该在加载页面时加载
<script type="text/javascript">
var dojoConfig = {
async: true,
cacheBust: false,
locale: 'en-au',
paths: {
"customModulePath": "/modules/custom",
}
};
</script>
你说动态加载包,但你真的是指模块吗?包通常是预先定义的,但定义包不会加载任何内容。当您将特定的模块ID传递给
require
或define
时,将加载模块,动态加载模块应该非常简单。好的。然后,我想我的术语有点混乱。我最大的事情是当我加载模块时,我希望引用它们并使用它们。我很好奇,当我试图像示例代码一样在循环中这样做时,它是如何工作的?在require
或define
语句中,我将如何引用它。使用packageName
或变量内容,例如ArcGISDynamicMapServiceLayer
?感谢您的回答。我不认为有可能做我想做的事,但我想问那些知道更多的人。我想我可以做到,但我需要对信息进行更多的手动解析,然后需要模块并使用它。基本上,添加更多的if,然后在其中添加代码以进行配置。
<script type="text/javascript" src="path/to/jsapi/3.13/jsapicompact/init.js"></script>
var parameters = [ {
url: "customModulePath/A",
name: "ParameterA"
},{
url: "customModulePath/B",
name: "ParameterB"
};
var urls = [];
for (var p in parameters){
urls.push(parameters[p].url);
}
require(urls, function(){
for (var p in parameters){
// use the function arguments to map it back!
this[parameters[p].name] = arguments[p];
}
// Now access your arguments like
console.log(this.ParameterA);
console.log(this.ParameterB);
// It is advisable to check if it is an object or a function before you use it.
})