Как узнать, какой пункт Dojo AMD требует без имени?
Вопрос
У меня вопрос по декларации Додзё.В объявлении AMD для требуемой библиотеки для додзё я заметил, что у некоторых библиотек не указано имя в параметре funciton.Как узнать, у какого из них нет параметров?
Например:
Для запроса селектора я видел пример, в котором не указано имя dojo/NodeList-dom и готового додзё.
require(["dojo/query", "dojo/dom-class", "dojo/on", "dojo/NodeList-dom", "dojo/domReady!"], function(query, domClass, on) {
Неужели просто необязательно давать им имена?То есть, если я не хочу указывать их имена, мне следует поместить их в конец списка?
Или я могу дать им произвольные имена?Я видел пример, в котором имена domReady присваиваются переменной с именем «request».
Я предполагаю, что это правильно?
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) {
Кроме того, как узнать, нужны ли им имена, могу ли я просто не называть ни одного из них?
Решение
Вы можете выбирать, что вам называть, а что нет.Это зависит от того, что делает модуль и нужен ли вам параметр обратного вызова для работы с ним.Например, 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) {
});
Но они вам не пригодятся.Таким образом, вы можете назвать все модули, если вам так проще.
Лучший способ узнать, нужно ли вам давать ему имя или нет, — это посмотреть, как они используются в справочное руководство.Если вы видите, что параметр обратного вызова используется для вызова функций модуля, например:
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
в конце списка модулей.
Теперь давайте посмотрим, сможем ли мы ответить на ваши примеры кода:
Ваш первый пример верен, как я только что объяснил. 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
в этом случае.Сбивает с толку, не так ли?Вот почему вам следует выбирать имена собственные.