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 ответа
Это потому что requireIf
s анализируются с помощью регулярных выражений в качестве самого первого шага и выполняются до нормального выполнения программы.
Если вы соберете исходный код 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, это не проблема. Кроме того, добавление имени модуля в качестве свойства в публично видимый модуль также позволит избежать этой проблемы.