Шаблон для шаблона модуля Javascript и инициализация субмодуля - PullRequest
13 голосов
/ 22 февраля 2011

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

Мне не очень приятно, какЯ обрабатываю последовательности инициализации в Javascript, используя шаблон модуля / субмодуля.

Допустим, мой код заканчивается чем-то вроде

FOO.init()
FOO.module1.init()
FOO.module2.init()
FOO.module3.init()
FOO.module4.init()

в глобальной области видимости.

По сути, я делаю (проверка ошибок и подробности опущены для краткости):

var FOO = (function (me) {
    me.init = function () {
        for (var i in me.inits) {
            me.inits[i]();
        }
    }

    return me; 
}(FOO || {}));

var FOO = (function (parent) {
    var me = parent.module1 = parent.module1 || {};

    me.init = function () {
    }

    parent.inits.push(me.init);

    return parent;
}(FOO || {}));

$(document).ready(FOO.init);

для инициализации.

Я знаю, что читал об этом раньше, но не могу придуматьправильные условия поиска, чтобы найти статьи сейчас.Есть ли хорошо продуманный и проверенный шаблон, который обрабатывает инициализацию в подобных ситуациях?

Спасибо.

РЕДАКТИРОВАТЬ: После перечитывания этого, я думаю, небольшой контекст даст ответы.

В моем случае каждый модуль / подмодуль находится в своем собственном файле.Базовый модуль определяет основные функциональные возможности сайта, а подмодули предоставляют различные функции.Например, субмодуль может подключить автозаполнение в окне поиска, а другой может превратить статическое изображение заголовка во вращающийся баннер.Подмодули включены / отключены CMS, поэтому я действительно хочу развести явные вызовы внутри базового модуля, чтобы CMS могла управлять всем.Я также знаю, что для этого есть особые способы CMS, но я искал общий шаблон Javascript для этого, чтобы обеспечить согласованность и устойчивость между проектами, которые могут использовать другую CMS.

1 Ответ

18 голосов
/ 22 февраля 2011

Лично у меня другой стиль кодирования.Это одна из них.Другой - это, по сути, имитация стиля, используемого в backbone.js

var myProgram = (function() {
   var someGlobal, someGlobal2;   

   var subModule1 = (function() {
       ...       

       var init = function() {

       };

       ...

       init();

       return { 
           "someMethod": someMethod,
           ...
       };
   }());

   var OtherSubModule = (function() {
       ...
       var init = function(param) { ... };
       ...
       return { 
           "init": init,
           ...
       };
   }());

   var init = function(param) {
       ...

       OtherSubModule.init({
           "foo": param.foo,
           "bar": param.bar,
           ...
       });
   };


   return { 
       "init": init,
       "somePublic": OtherSubModule.foobar, 
       ...
   }
}());

Зависит от того, нужно ли мне предоставлять публичный API другим пользователям, и эта магистраль работает намного лучше.Я предпочитаю делать модули, управляемые функцией init, для начальной конфигурации, а для остальных - полностью управляемыми событиями.

[Edit]

Учитывая отредактированный вопрос, у меня есть другой шаблон для этого.Каждый файл определяет функцию для некоторого объекта, в моем случае это было $.FooBar.plugins

(function() {

    var foo = function() { ... };

    var bar = (function() { ... }());

    myNamespace.plugins["MyPlugin"] = function() {

        ... do stuff
        ... bind to evevnts
    };

}());

Затем мы используем загрузочный стриппер, который был примерно таким:

(function() {

    var needed = function() {
         // Feature detection
    };

    var load = function() { ... };

    var getOptions = function() {
         // Call something on a page by page basis.
    };

    for (var plugin in pluginList) {
         if (needed(plugin)) {
               load(plugin, function() {
                    // get page specific options
                    var options = getOptions();
                    // run plugin
                    myNameSpace.plugins[plugin](options);
                    // If all have been loaded trigger ready handlers
                    if (pluginCurrentCount == pluginCount) {
                         readyTrigger();
                    }
               });
               pluginCount++;
         }
    }

    // start loading plugins after all have been counted
    load.startLoading();

    var readyTrigger = function() {
         // Run all ready handlers
    }

    // Implement your own DOM ready function to run when all plugins
    // have loaded.
    myNameSpace.ready = function(handler) {
         if (isReady) {
             handler();
         } else {
             readyList.push(handler);
         }

    };
}());

Это многопробелы и псевдокод, но вы должны понять.Если это не obvouis чувствую, чтобы подвергнуть сомнению это.

Тогда на странице у нас есть кое-что как это

<html>
<head>
  <script type="text/javascript">

    var pageSpecific = {
         "pluginName": {
              "cssClass": "foobar",
              "submitOnEnter": false,
              ...
         },
         ...
    };

  </script>
  <script src="bootstrapper.js" />
  ...
</head>
<body>
  ...
</body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...