Dojo函数参数顺序



使用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,错误消失了。我在另一个不同parm的脚本中遇到了同样的问题。是否有一些文档解释了如何对参数进行排序?dojo元素必须在数字元素之前吗,dojo/domReady不能承受吗?

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

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
});

在第一个示例中,您在dojo/request之前导入dojox/validate/web,但在回调中没有dojox/validate/web的参数。结果很简单,名称为request的参数将包含dojox/validate/web的返回对象,而不是dojo/request的返回对象。因此,调用request对象可能无法工作。

因此,您需要记住的是,您需要保持正确的顺序并且没有返回值(或您不需要的返回值)的模块应该放在最后

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

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

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

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

如果你使用另一个AMD加载程序,比如requirejs,你会看到同样的行为。

在使用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

它处理request参数,就好像它是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这样的语言,在编写函数时,您可以声明参数类型,然后再声明参数的名称。

最新更新