我对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) {
另外,你怎么知道你是否需要他们的名字,我可以不指出他们中的任何一个吗?
答案 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
。令人困惑,不是吗?那就是你应该选择合适的名字。