Как узнать, какой пункт Dojo AMD требует без имени?

StackOverflow https://stackoverflow.com//questions/21012256

  •  21-12-2019
  •  | 
  •  

Вопрос

У меня вопрос по декларации Додзё.В объявлении 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 в этом случае.Сбивает с толку, не так ли?Вот почему вам следует выбирать имена собственные.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top