Я наконец понял that and why named classes are not a good practice и хотел бы обновить свой код. Тем не менее, даже после того, как readingseveraldocumentationpages, blogentriesandSOquestions, я не понимаю, как сделать это надлежащим образом AMD , когда мне нужно использовать модуль вне функции, где требуются модули. Поддерживает ли AMD это, или я должен полностью переставить файл, из которого я использую класс AMD?Как я могу использовать пользовательские модули Dojo в правильном режиме AMD вне начальной функции?
То, что я делал раньше - конфигурации:
var dojoConfig = {
paths: {
fooBar: '@Url.Content("/portal/Modules/Foo.Bar/Scripts/foo-bar")'
}
};
В модуле:
define("fooBar/foo", [/*required modules*/], function(/*required modules*/) {
//the rest of code
return declare("fooBar.foo", [/*superclass*/], {
//the rest of code
И в файле, где я использую его:
var required = [
/*first 5 required modules*/
"fooBar/foo",
/*the rest of required modules*/
]
require(required, function (/*5 first modules*/, Foo) {
//code
var barBaz = _customFunction(/*parameters*/);
//code
});
//Foo and other names set by require are not available here
function _customFunction(/*parameters*/) {
//code
var foo = new fooBar/foo({/*parameters*/});
//code
}
я удалил имя модуля из класса, и я больше не вижу его. Даже fooBar
не определен, если мне не требуется именованная функция bar
из того же пространства имен. Я добавил async: true
в конфигурацию, но ничего не изменилось. Я понимаю, что конструкторы классов AMD не следует включать в функцию, где требуется модуль (не спрашивайте меня об источнике, где-то связанном выше), но как создать объект класса?
Что должно работать, это еще один вызов, требуемый, но я не уверен, как его использовать. Что, я не уверен, считается ли это хорошей практикой - создание грязного обходного пути нарушит точку перехода к неназванному объявлению.
Что нужно сделать, чтобы положить все в функцию-оболочку или, возможно, в класс, где код не выходит за рамки инструкции require. В моем случае я переместил функцию _customFunction
в именованный класс с пустым конструктором, чтобы избежать обертывания и, возможно, разбивать десятки функций, находящихся в одном файле; мы также преобразуем остальные, как только у нас будет время ... и убедитесь, что мы действительно улучшаем код.
Итак, рыба поймана, но я все еще застрял на полпути в этом уроке.
TL; DR: мне нужно понять, что это хорошая практика, и что это не так хорошая практика, но до сих пор работает (и почему) транскрибирования конструктора класса вызовов, проживающие за рамки имен, установленных Требовать заявление.
'require (required, function (foo) {var myFoo = new foo ({/ * parameters * /});}); 'См. Примеры require() здесь: https://dojotoolkit.org/documentation/tutorials/1.10/hello_dojo/index.html – Xodrow
@Xodrow: при изучении того, что вы указали, я нашел, как я упростила проблему, пытаясь не утопить вас в нерелевантном коде. Я также нашел обходной путь, но я до сих пор не понимаю, что такое хорошая практика и что не для того, чтобы переписать старый грязный код, который у меня был в чем-то чистом. –