Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 动态加载Dojo包_Javascript_Dynamic_Dojo_Packages_Esri - Fatal编程技术网

Javascript 动态加载Dojo包

Javascript 动态加载Dojo包,javascript,dynamic,dojo,packages,esri,Javascript,Dynamic,Dojo,Packages,Esri,我正在设置一个映射应用程序,无法理解部分工作流程。我正在使用ESRI的JSAPI,它使用Dojo back。我从数据库中提取数据,并将其加载到一个隐藏字段中,以便在加载时进行解析 当我想设置Dojo加载哪些包时,我的问题就来了。我有包名和包URL,我正试图让它们动态加载。但我还需要能够使用这些包来创建新对象,如地图层对象 我有一个初始的require语句,用于加载映射本身: require(["application/bootstrapmap", "dojo/domReady!"],

我正在设置一个映射应用程序,无法理解部分工作流程。我正在使用ESRI的JSAPI,它使用Dojo back。我从数据库中提取数据,并将其加载到一个隐藏字段中,以便在加载时进行解析

当我想设置Dojo加载哪些包时,我的问题就来了。我有包名和包URL,我正试图让它们动态加载。但我还需要能够使用这些包来创建新对象,如地图层对象

我有一个初始的
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.
})