如何知道哪个Dojo AMD需要没有名字的子句?

时间:2014-01-09 05:28:50

标签: amd dojo

我对Dojo声明有疑问。我在AMD声明中注意到dojo所需的库,某些库在funciton参数中没有声明的名称。你怎么知道哪一个没有参数?

例如:

对于选择器查询,我看到了一个没有为dojo / NodeList-dom和dojo准备名称的示例。

require(["dojo/query", "dojo/dom-class", "dojo/on", "dojo/NodeList-dom", "dojo/domReady!"], function(query, domClass, on) {

给他们起名字只是可选的吗?所以如果我不想要声明他们的名字,我应该将它们放在列表的末尾?

或者我可以给他们任意名字吗?我看到了一些示例,它使用名为“request”的变量为domReady命名。

我认为这是正确的吗?

require(["dojo/query", "dojo/dom-class", "dojo/on", "dojo/NodeList-dom", "dojo/domReady!"], function(query, domClass, on, nodeList, request) {

虽然这不是?

// No name for NodeList-dom
require(["dojo/query", "dojo/dom-class", "dojo/on", "dojo/NodeList-dom", "dojo/domReady!"], function(query, domClass, on, request) {

另外,你怎么知道你是否需要他们的名字,我可以不指出他们中的任何一个吗?

1 个答案:

答案 0 :(得分:4)

您可以选择您的名字和不名字。这取决于模块的功能以及是否需要回调参数才能使用它。例如,dojo/query模块对于查询DOM节点非常有用,但如果没有实际引用它(函数参数),则无法使用它。

另一方面,像dojo/NodeList-dom这样的模块扩展了dojo/query模块,你不需要他们的回调来处理它。


小部件在有或没有回调参数的情况下都很有用。如果使用小部件声明,则不需要回调,而如果以编程方式创建它们,则需要小部件来实例化它,例如:

require(["dijit/form/FilteringSelect"], function(FilteringSelect) {
    return new FilteringSelect({});
});

虽然声明性地只需要:

require(["dijit/form/FilteringSelect", "dojo/parser"], function() {

});

但是,即使你的模块没有用于获得回调参数的目的(例如dojo/NodeList-dom),你仍然可以为它们命名:

require(["dojo/NodeList-dom"], function(NodeList) {

});

但它们对你没用。因此,如果您发现更容易,您可以将所有模块命名为。

了解您是否需要命名的最佳方法是查看reference guide中如何使用它们。如果您看到callback参数用于调用模块函数,例如:

require(["dojo/query", "dojo/NodeList-dom", "dojo/domReady!"], function(query) {
    query("#myNode").forEach(function(node) {
        console.log(node);
    });
});

我们使用query回调来查询#myNode,因此我们需要对其进行命名。但是,dojo/NodeList-dom扩展了query(例如forEach()函数),因此我们无需为其命名。

dojo/domReady!模块/插件也不必命名。该模块将确保仅在加载DOM时调用回调函数。


一个重要的注意事项是回调参数的顺序与模块的顺序相同。即使模块没有返回您可以使用的正确对象,它仍然很重要。例如(以下内容不起作用):

require(["dojo/NodeList-dom", "dojo/query", "dojo/domReady!"], function(query) {
    query("#myNode").forEach(function(node) {
        console.log(node);
    });
});

许多人认为,因为dojo/NodeList-dom没有返回有用的对象,所以他们可以这样做,但事实并非如此。 query回调参数实际上将包含此示例中dojo/NodeList-dom返回的数据(因为它是第一个参数),无论数据是什么。

因此,如果您实际上不需要模块的回调参数,最简单的方法是将其添加到模块列表的末尾,或者您可以执行以下操作(如前所述):

require(["dojo/NodeList-dom", "dojo/query", "dojo/domReady!"], function(NodeList, query) {
    query("#myNode").forEach(function(node) {
        console.log(node);
    });
});

但是,对于其他开发人员(阅读代码),此示例可能会有用,因为他们可能认为可以使用NodeList参数。因此,为了保持代码的可读性,我建议您只将dojo/NodeList-dom放在模块列表的末尾。


现在让我们看看我们是否可以回答您的代码示例:

正如我刚才解释的那样,你的第一个例子是正确的。 <{1}}和dojo/NodeList-dom不会返回有用的对象,因此您可以将其删除。

你的第二个例子也是正确的。即使您不使用回调,也可以选择为这些模块命名。

第三个示例也是正确的,然而 dojo/domReady!参数将包含request回调且 dojo/NodeList-dom回调。您可以选择如何命名。它是否有效取决于你对dojo/domReady!回调的处理方式。我的意思是,以下示例也可以使用:

request

但在这种情况下,require(["dojo/query", "dojo/NodeList-dom", "dojo/domReady!"], function(NodeList, domReady, query) { NodeList("#myNode").forEach(function(node) { console.log(node); }); }); 回调参数包含NodeList的结果,dojo/query包含domReady的结果,dojo/NodeList-dom包含query的结果dojo/domReady!。听起来有点混乱,它会起作用。但正如您所看到的,要查询#myNode,我需要dojo/query的结果,在这种情况下为NodeList。令人困惑,不是吗?那就是你应该选择合适的名字。