2016-03-08 4 views
1

Я наконец понял 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: мне нужно понять, что это хорошая практика, и что это не так хорошая практика, но до сих пор работает (и почему) транскрибирования конструктора класса вызовов, проживающие за рамки имен, установленных Требовать заявление.

+0

'require (required, function (foo) {var myFoo = new foo ({/ * parameters * /});}); 'См. Примеры require() здесь: https://dojotoolkit.org/documentation/tutorials/1.10/hello_dojo/index.html – Xodrow

+0

@Xodrow: при изучении того, что вы указали, я нашел, как я упростила проблему, пытаясь не утопить вас в нерелевантном коде. Я также нашел обходной путь, но я до сих пор не понимаю, что такое хорошая практика и что не для того, чтобы переписать старый грязный код, который у меня был в чем-то чистом. –

ответ

0

По-видимому, только учебник Dojo, который я не читал, прежде чем задавать этот вопрос contains the right advice для меня!

Основные части:

снова, повторите за мной «глобальное пространство имен плохо, глобальное имен плохо, я не буду использовать глобальное пространство имен, я не буду использовать глобальное пространство имен».

Так что оберните его внутри require заявление.

В замыкании require() мы ссылаемся на модули на основе имени переменной, объявленного в аргументе.

Это может быть в пределах declare, но это не обязательно.

Другая основная функция в AMD - это define(), которая обычно используется для , определяющих модули. Дополнительную информацию о том, как использовать define(), см. В разделе «Определение модулей» для получения более .

Так что, несмотря на то, что все еще есть несколько технических деталей, о которых я не уверен, теперь я понимаю основную идею, и я знаю, что искать на следующем шаге. Остальное должно быть легко. Я могу обновить, чтобы улучшить этот ответ еще более поздно, чтобы помочь другим с той же проблемой, но я счастлив сейчас :-)

 Смежные вопросы

  • Нет связанных вопросов^_^