我想你错过了在dojo配置中配置路径以便通过AMD加载器访问fileupload.js文件。 dojoConfig doc 有很多类型的配置(basURl,包,路径......),下面你可以看到如何使用配置 packges ,dojo将使用require加载文件,没有任何问题
packges
所以在加载arcgis js api之前 <script src="url_api_js"></script> 做下面的事情(用dojo配置dojo) dojoConfig VAR)
<script src="url_api_js"></script>
dojoConfig
<script type="text/javascript"> var dojoConfig = { packages: [ { name: "mypackage", location: location.pathname.replace(/[^\/]+$/, '') +"/static" } ] }; <script> <script src="url_api_js"></script>
并且您的代码内部使用文件包/名称,如下所示
require(['mypackage/fileUpload'], function(upload) { upload.showDialog(); });
注意:根据服务器类型,位置可能会发生变化,在这个例子中,位置如下: {location_name}/static/fileupload.js
{location_name}/static/fileupload.js
希望这会对你有所帮助。
使用AMD时,您可以通过定义事物来管理依赖项 define() 但是模块的客户端必须使用它来导入它 require() 功能, 看文档 同时你尝试通过实例化所需的模块 new 这是不正确的。
define()
require()
new
要在DOM处理程序中使用某些模块,您需要额外的包装,例如你的HTML会做的 onclick="whenClicked()" 如果你在范围内有这个功能:
onclick="whenClicked()"
function whenClicked() { require(['fileUpload'], function(fu) { fu.showDialog(); }); }
当然假设'fileUpload'是正确指定的AMD模块。
的 编辑: 强> Plunker上OP样本的修改版本: https://plnkr.co/edit/QFckwndDicGpTfzhGwFC?p=preview
注意 fileUpload.js 模块定义已更改,以便显示基本警报:
fileUpload.js
define([ "dijit/registry", "dijit/Dialog", "dijit/form/Button", "dojo/domReady!" ], function (registry) { return { // Show the dialog showDialog: function() { //registry.byId("uploads").show(); alert("this is file upload mock"); } } });
以及 home.js 托管定义 whenClicked :
home.js
whenClicked
function whenClicked() { require({ packages: [ {name: "fileUpload", // location should point to fileUpload.js on your target server location: "https://run.plnkr.co/uv2ILkhQpQC2wqRV", main: "fileUpload"} ]}, ['fileUpload'], function(fu) { console.log("fileupload"); fu.showDialog(); }); }
注意显示 location 模块类似于bRIMO在其他答案中所说的。我的方法只为这个由require包装的特定代码配置位置; bRIMO的方法是全球性的。
location
但请注意,Plunker正在重建 location 每次重新加载编辑器时的URL:/它实际上意味着您修复位置前缀,运行正常,重新加载Plunker页面,它再次被破坏。