Динамически создать объект пространства имен из переменной - PullRequest
0 голосов
/ 13 декабря 2011

Для приложения Titanium, которое я пишу, я структурировал модульный подход, при котором другие разработчики (когда меня покинули мою организацию или других попросили добавить в приложение) могут добавлять новые модули вприложение легко (не путать с модулями собственного кода).

Мне трудно понять, как загрузить модуль из массива и вызвать общий метод типа начальной загрузки для инициализации модуля.Приложение использует подход к пространству имен, предложенный авторами Tweetanium.

Приложение использует пространство имен: org.app

Я определил массив, который содержит настроенные модули, которые должны бытьзагружено в приложение:

org.modules = [
    {
        name: 'messages',
        enabled: true,
        title: 'Messages'
    },
    {
        name: 'calendar',
        enabled: true,
        title: 'Calendar'
    }
];

Каждый модуль имеет пространство имен: org.module.moduleName, где moduleName - это имя модуля из массива (например, сообщения или календарь).

IЯ создал каталог модулей, и мне удалось динамически включить файл js для каждого модуля, который включен (проверено путем статического вызова метода).Мне нужно вызвать метод createModuleWindow() из кода модуля, чтобы получить основное представление для этого модуля.

org.module = {};
org.module.moduleManager = [];

// Loop through the list of modules and include the 
// main modulename.js file if enabled.
// Create the module and add it to the module manager array
var modules = org.modules;
var config = org.config;
for (var i = 0; i < modules.length; i++) {
    var _module = modules[i];
    if (_module.enabled) {
        Ti.include(config.moduleBasePath + _module.name + "/" + _module.name + '.js');
        org.module.moduleManager.push(createModuleWindow(_module.name));
    }
}

function createModuleWindow(moduleName) {
    // Not sure what to do here.
    return org.module.[moduleName].createMainWindow();
};

Для createModuleWindow() я пробовал динамические классы и обозначения в квадратных скобках, но я простополучить ошибки, такие как 'moduleName', не является конструктором (в случае использования подхода класса) или ошибкой синтаксического анализа в случае приведенного выше кода.

Как я могу динамически вызывать метод модуля пространства имен?

Ответы [ 2 ]

1 голос
/ 13 декабря 2011

Ваша синтаксическая ошибка здесь:

return org.module.[moduleName].createMainWindow();
                 ^

Не должно быть точки:

return org.module[moduleName].createMainWindow();

Пара других заметок:

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

  • Использование как org.module (в единственном числе), так и org.modules (во множественном числе) излишне сбивает с толку. Я хотел бы попытаться лучше различить два в коде.

0 голосов
/ 13 декабря 2011

Вы можете использовать [] вместо свойства / функции переменной пространства имен:

var obj = {
    someProperty: 'testing',
    anotherProperty: {
        testFunc: function() {
            return 'nested func';
        }

};

console.log(obj.someProperty); // logs 'testing'
console.log(obj['someProperty']); // same as above
console.log(obj['anotherProperty'].testFunc()); // logs 'nested func'
console.log(obj['anotherProperty']['testFunc']()); // same as above

Итак, в вашей ситуации:

return org.module[moduleName].createMainWindow();

должно работать.Надеюсь, это поможет.

...