dojo.requireIf не разрешает локальные переменные

Я пытался использовать dojo.require(If) с локальной переменной для динамической загрузки модуля на странице на основе условия.

// примечание: dojo v1.4
djConfig = {
  debugAtAllCosts: правда
};

Пример 1 (не работает):

(function () {
  var nameOfClass = "Two";
  dojo.require ("my.namespace." + nameOfClass);
  dojo.addOnLoad (function () {
    var oneOrTwo = new my.namespace [nameOfClass] ();
  });
} ());

Ошибка: ReferenceError: nameOfClass не определено.

Пример 2 (не работает):

(function () {
  var nameOfClass = "Two";
  dojo.requireIf (nameOfClass == "One", "my.namespace.One");
  dojo.requireIf (nameOfClass == "Two", "my.namespace.Two");
  dojo.addOnLoad(function() {
    var oneOrTwo = new my.namespace[nameOfClass]();
  });
}());

Ошибка: ReferenceError: nameOfClass не определено.

Пример 3 (работает):

(function () {
  window.nameOfClass = "Два";
  dojo.requireIf(window.nameOfClass == "One", "my.namespace.One");
  dojo.requireIf(window.nameOfClass == "Два", "my.namespace.Two");
  dojo.addOnLoad(function() {
    var oneOrTwo = new my.namespace[nameOfClass]();
  });
}());

По некоторым причинам, это выглядит так, как будто require и requireIf разрешают только глобальные переменные внутри них. Это текущее ограничение, или я просто делаю что-то не так?


Обновление 1:

Поэтому, если я вас правильно понимаю (@Maine, @jrburke), это ограничение debugAtAllCosts? Если приведенный выше код построен как междоменный (с добавлением префикса / суффикса файла xd) и выполняется - он будет работать так, как ожидалось?

Если это так, то каков правильный способ локального тестирования кода, который будет выполняться как междоменный, без фактической сборки?

Это также заставляет меня усомниться в мотивации предварительного анализа dojo.require(s). Если loader_xd не будет (или, скорее, не сможет) предварительно анализировать, почему метод, созданный для тестирования / отладки, делает это?

Обновление 2:

Поскольку два вопроса в обновлении 1 выше не связаны с этим вопросом, я перенес их в отдельное обсуждение.

2 ответа

Решение

Это потому что requireIfs анализируются с помощью регулярных выражений в качестве самого первого шага и выполняются до нормального выполнения программы.

Если вы соберете исходный код Dojo для requireIf, вы должны найти такие строки для его обработки (loader_xd.js):

var depRegExp = /dojo.(require|requireIf|provide|requireAfterIf|platformRequire|requireLocalization)\s*\(([\w\W]*?)\)/mg;

Затем условие выполняется с eval в глобальном масштабе, а не как часть нормального потока.

Чтобы прояснить больше того, что сказал Main, это проблема загрузчика XD в Dojo. debugAtAllCosts: true использует загрузчик XD. Если вы просто используете обычный загрузчик Dojo без debugAtAllCosts, это не проблема. Кроме того, добавление имени модуля в качестве свойства в публично видимый модуль также позволит избежать этой проблемы.

Другие вопросы по тегам