1

使用 dojo 声明函数时,参数的顺序似乎是正确的。此函数头导致错误:

require(["dojo/dom",
    "dijit/Dialog",
    "dijit/form/Form",
    "dijit/form/TextBox",
    "dijit/form/ValidationTextBox",
    "dijit/form/Textarea",
    "dijit/form/Button",
    "dojox/validate/web",
    "dojo/request",
    "dojo/domReady!"],
function(dom, Dialog, Form, TextBox, ValidationTextBox, TextArea, Button, request)

request.post 的执行导致未定义的错误。然后我将公园的顺序更改为:

require(["dojo/dom",
    "dojo/request",
    "dijit/Dialog",
    "dijit/form/Form",
    "dijit/form/TextBox",
    "dijit/form/ValidationTextBox",
    "dijit/form/Textarea",
    "dijit/form/Button",
    "dojox/validate/web",
    "dojo/domReady!"],
function(dom, request, Dialog, Form, TextBox, ValidationTextBox, TextArea, Button ){

通过将 dojo/request 和 request 移到更早的顺序,错误就消失了。我在另一个具有不同参数的脚本中遇到了同样的问题。是否有一些文档解释了如何订购参数?dojo 元素是否必须在数字元素之前,dojo/domReady 不能承受?

4

3 回答 3

4

该顺序应与您在模块名称数组中维护的顺序相同。这意味着以下是正确的:

require(["my/first", "my/second"], function(first, second) {
    ...
});

但是,当您使用在回调中不需要返回值的模块时,它们应该被插入last

require(["my/first", "my/second", "dojo/domReady!"], function(first, second) {

});

如果您不保持该顺序,例如在下一个示例中,那么您将遇到问题,因为参数将包含一些不起作用的东西。

require(["my/first", "dojo/domReady!", "my/second"], function(first, second) {
    // "second" doesn't work
});

在您的第一个示例中,您dojox/validate/web之前导入dojo/request但在您的回调中您没有参数 for dojox/validate/web。结果很简单,带有名称的参数request将包含返回的对象 ofdojox/validate/web和 not of dojo/request。因此,调用该request对象可能不起作用。

所以你需要记住的是你需要保持正确的顺序并且没有返回值(或者你不需要的返回值)的模块应该放在最后

如果你不把它们放在最后一个位置,那么你必须指定一个返回值,例如,下一个例子将起作用:

require(["my/first", "dojo/domReady!", "my/second"], function(first, domReady, second) {
    ...
});

但这是浪费内存,因为domReady参数不会包含任何有用的数据(至少,如果你不使用它的话)。

于 2013-07-27T17:38:58.803 回答
1

正如 Dimitri 所说,顺序很重要,但实际上是异步模块定义 ( AMD ) 规范描述了这一点:它不是特定于 Dojo 的东西。

如果您使用其他 AMD 加载程序,例如requirejs,您将看到相同的行为。

于 2013-07-28T13:09:33.473 回答
0

在使用 dojo 时,我认为 require([""]) 部分是传递给函数的参数的参数类型。

所以,

require(["dojo/dom",
"dijit/Dialog",
"dijit/form/Form",
"dijit/form/TextBox",
"dijit/form/ValidationTextBox",
"dijit/form/Textarea",
"dijit/form/Button",
"dojox/validate/web",
"dojo/request",
"dojo/domReady!"],
function(dom, Dialog, Form, TextBox, ValidationTextBox, TextArea, Button, request)

当你尝试打电话时

request.post

它正在处理“请求”参数,就好像它是一种“dojox/validate/web”对象一样。如果您的函数签名是:

function(dom, Dialog, form, TextBox, ValidationTextBox, TextArea, Button, validateWeb, request)

你的代码本来可以正常工作的。

另一个类比是按照以下方式考虑它:

function("dojo/dom" dom, "dijit/Dialog" Dialog, "dijit/form/Form" Form, ..."dojo/request" request, string[] args0)

以上显然是不正确的语法,但它有助于我以这种方式将其可视化,就好像它是一种语言,如 java 或 .net,在编写函数时,您声明参数类型,后跟参数名称。

于 2014-08-05T18:12:09.883 回答