Dojo/请求未定义,尽管需要

Dojo/request undefined despite require

本文关键字:请求 未定义 Dojo      更新时间:2023-09-26

在一个与Orchard视图相关的脚本中,我试图用dojo.request.post函数将AJAX发布到服务器。然而,我只得到esri/requestdojo/request是未定义的。我在require语句所在的函数之外调用请求,但只要以正确的格式使用其他所需的包,它们就没有问题。Dojo/request在我们的另一个项目中工作,所以我怀疑Orchard把事情搞砸了(另一项目的dojo/request使用在一个普通页面中,而不是在视图中),尽管我预计它引起的问题会更早出现。

代码的重要部分:

require([ ... "dojo/request", ... ], function (... Request, ...) {
  //custom init function contents
})
function sendResults(featureSet) {
  //custom code processing the parameter, making uri, JSON and like
  dojo.request.post(uri, {
    //sending data
  })
}

我的剃须刀需要的零件在同一个文件中包含:

Script.Require("esri/JavaScriptApi").AtHead();
Script.Require("dojo").AtHead();

这些定义见resourcemanifest.cs:

 manifest.DefineScript("esri/JavaScriptApi").SetUrl("http://js.arcgis.com/3.14/");
 manifest.DefineScript("dojo").SetUrl("//ajax.googleapis.com/ajax/libs/dojo/1.10.4/dojo/dojo.js");

当我尝试运行代码时出现的错误:

TypeError: dojo.request is undefined

我在FireBug中测试了它,并确认dojo/request不存在(对于变体,如dojo/Request也是如此),只有esri/request是一个函数,但它没有post方法。

我被困在这里了。谷歌搜索导致了"纯粹绝望的平原"(第5+页),没有有用的输出,我的同事也不知道。有人知道我为什么看不到dojo/request以及如何获得它吗?

据我所知,dojo/request不导出全局(现代AMD模块通常不需要导出),因此dojo.request永远不会在任何上下文中工作。

使用AMD模块的适当方法是在require回调的主体中使用它们(或者,更好的是,在AMD模块中组织自己的代码,并在define工厂函数中使用它们)。

require([ ... "dojo/request", ... ], function (... request, ...) {
  request.post(...);
})

或者,如果您确定dojo/request在您想要使用它时已经加载,您可以使用单个参数require来引用它:

require('dojo/request').post(...);

然而,这通常并不理想,并被视为黑客攻击。

也许AMD模块简介教程将有助于更好地了解AMD的最佳使用情况。