2011-12-12 121 views
0

對於我正在編寫的一個Titanium應用程序,我已經構建了一個模塊化方法,以便其他開發人員(當我從組織或其他人移動到另一個開發人員時被要求添加到應用程序)可以輕鬆地將新模塊添加到應用程序(不要與本機代碼模塊混淆)。從變量動態創建名稱空間對象

我很難搞清楚如何從數組中加載模塊並調用一個通用的中央引導類型方法來初始化模塊。該應用程序按照Tweetanium作者的建議使用名稱空間方法。

該應用程序使用的命名空間:org.app

我定義包含配置模塊,其在該應用被加載的陣列:

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

每個模塊具有名稱空間:org.module.moduleName其中moduleName是數組中模塊的名稱(例如消息或日曆)。

我已經創建了一個模塊目錄,並且我已經成功地爲每個啓用的模塊動態包含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」不是一個構造函數(在使用類方法的情況下),或在解析錯誤上述代碼的情況。

如何動態調用名稱空間模塊方法?

回答

1

你的語法錯誤是在這裏:

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

應該沒有點:

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

一對夫婦的其他注意事項:

  • org.module是在你的示例代碼空,所以上面的行會拋出一個空指針異常。 (您可能只是沒有顯示您的所有代碼。)

  • 同時使用org.module(單數)和org.modules(複數)無需混淆。我會盡量在代碼中區分兩者。

0

您可以使用[],而不是一個命名空間變量的屬性/功能:

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(); 

應該工作。我希望這有幫助。