Шаблон модуля JavaScript - Как создавать подмодули - PullRequest
5 голосов
/ 19 октября 2011

Как получить доступ / создать субмодуль на основе шаблона модуля?

Я бы хотел иметь возможность доступа к методам из подмодулей в моем основном файле Modules.js.

Module.js

var Module = (function() {

    function A(){
      console.log("Module: A");
      B();
    };

    function B(){
       console.log("Module: B");
       Module.Utils.C(); /* Here is the problem */
    };

    return {
      A:A,
      B:B
    }

} ());

$(function() {
    Module.A();
});

Module.Utils.js

var Module = Module ? Module : {};

Module.Utils = (function() {

    var settings = {
        x : 1,
        y : 2
    };

    function C(){
      console.log("Module.Utils: C");
    };

    function D(){
       console.log("Module.Utils: D");
    };

    return {
      C:C,
      D:D
    }

}());

Ответы [ 2 ]

8 голосов
/ 19 октября 2011

Нет ничего плохого в вашем подходе, при условии:

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

Боковой вопрос

Ваш код в настоящее время имеет синтаксическую ошибку в следующей строке:

var Module.Utils = (function() {

Не должно быть ключевого слова var, предшествующего назначению.

Пример кода

Вот упрощенная версия вашего кода, разделенная, чтобы показать только методы, которые я вызываю, демонстрирующие, что ваш подход работает:

var Module = (function() {

    function B() {
        console.log("Module: B");
        Module.Utils.C(); /* accessing submodule public methods */
    };

    return {
        B: B
    };

})();

var Module = Module || {};

Module.Utils = (function() {

    function C() {
        console.log("Module.Utils: C");
    };

    return {
        C: C
    }

})();

Module.B();

Выход:

Module: B
Module.Utils: C
3 голосов
/ 19 октября 2011

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

Тогда «подмодулем» будет просто модуль, расположенный в module/utils, а вашему module модулю потребуется его как зависимость, которую RequireJS позаботится о том, чтобы разрешить для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...