2010-04-04 64 views
44

我最近開始使用Appcelerator的Titanium創建iPhone應用程序。由於應用程序基本上都是JS,所以我需要一些關於如何組織這個項目的建議。如何在Appcelerator Titanium項目中組織JS文件

爲應用程序中的每個視圖創建長程序文件變得非常容易。有沒有一種方法可以將MVC或某種結構合併到項目中?

謝謝,我很感激。 -Tilo

+0

偉大的問題。 – 2011-07-07 14:07:57

+3

雖然問題仍然相關,但請注意,一些答案已經過時:現在有一些教程和官方文檔中提到的模式 - 即使是很好的舊樣例應用程序KitchenSink(又名鼠王之王)已被重構以更好地反映當前的良好做法。 @jhaynie, 我會的聲明認爲,鈦本身基本上是MVC: – conny 2012-10-19 09:57:57

回答

31

鈦本身本質上是MVC,因爲您的app.js文件是主控制器,您創建的每個視圖都是視圖,並且您將視圖傳遞(或設置)了模型數據。

鈦,你可以使用一些很好的內置機制分解你的應用程序:

  1. Titanium.include - Titanium.include允許包括在地方更象C #include一個或多個JS文件編譯器指令。你可以在這個文件中添加常用的函數和JS類,然後將它們包含在你希望導入和使用的地方。

  2. Titanium.UI.createWindow - 您可以創建一個新的視圖作爲新窗口傳遞的屬性到另一個JS上下文的URL中,這將創建一個新的JS子上下文,並允許您維護自己的變量空間讓你回到你的父母)。

此外,鈦,您可以創建文件夾,讓您從邏輯上組織的方式,適合你和你的應用程序應用程序。

編輯:今天,Titanium.Include方法已被棄用。 正如文檔中提到的,我們應該創建一個CommonJS模塊並使用require()語句。關於這個陳述

的更多信息:Require

更多關於模塊的信息:Modules

+0

我會與聲明 – 2014-07-02 09:54:25

+2

(/請無視我的上述評論,我不能刪除它了)認爲。在處理所謂的經典鈦項目時,幾乎沒有強制實施的結構。具體來說,沒有控制器或模型。你可以想出你自己的結構,並使其像MVC一樣,但經典方法本身不是MVC。 鈦合金(儘管在您發佈答案時未發佈)是另一方面的MVC框架。它執行特定的項目結構並提供真正的關注點分離。 – 2014-07-02 10:09:45

6

這也可以幫助:由於我是https://github.com/krawaller/Struct

+2

這是一個有用的[博客文章](http://blog.krawaller.se/titanium-application-structure-learning-from),它解釋了該GitHub倉庫中正在發生的事情。 – philoye 2011-05-19 11:53:40

24

:如何組織一個鈦移動項目的基本結構沒有爲鈦移動項目找到合適的MVC解決方案,我提出了以下方法。對於小型應用程序,這可能過度設計,但可能有助於維護不斷增長的應用程序。

文件夾結構:

/Resources 
    /model 
    /view 
    /controller 
    /ui 
    /iphone 
    /android 
    app.js 
    app.jss 

對於需要一個命名空間分離的觀點,模型和控制器,所以我們在app.js定義它,這是我們的主控制器:

var app = { 
    view: {}, 
    controller: {}, 
    model: {}, 
    ui: {} 
} 

在我們爲每個組件放置單個JavaScript文件的文件夾。爲此,我們可以使用輕量級的JavaScript OOP庫,例如MooTools或Prototype,或者定義簡單的JS函數作爲我們的對象。如果你也想從父類繼承,一個庫肯定是有道理的。

實例:

# Resources/controller/MyController.js 
app.controller.MyController = function() { 
    return { 
     getView: function() { 
     return new app.view.MyView().getView(); 
     } 
    } 
} 

# Resources/view/MyView.js 
app.view.MyView = function() { 
    return { 
     getView: function() { 
     return Ti.UI.createWindow({...}); 
     } 
    } 
} 

# Resources/view/MyModel.js 
app.model.MyModel = function() { 
    return { 
     some: "data", 
     foo: "bar" 
    } 
} 

那之後,我們可以包括與Ti.include()在app.js文件中的所有需要​​的模型/視圖/控制器類和與我們的命名空間引用的組件:

Ti.include("controller/MyController.js"); 
Ti.include("view/MyView.js"); 
var myController = new app.controller.MyController(); 
var myView = myController.getView(); 
myView.open(); 

MVC方法現在假定控制器「控制」視圖的狀態並將數據從模型傳遞到視圖中。該視圖僅包含UI元素和樣式屬性。在UI中進行的任何操作都會觸發一個事件,該事件通知控制器執行所需的操作。

但當然,MVC的確切定義可能會根據您的個人品味不同;)

+0

喜歡你的解決方案。做了同樣的方式,並取得了不錯的經驗。 – mkind 2011-08-01 08:14:08

+0

喜歡它很多,真的很想使用它。我如何在我的應用程序中使用它? – 2011-08-22 17:17:40

+0

我喜歡這個。 2014年的非合金版本只會使用require()而不是Ti.include()嗎? – 2014-03-05 14:51:36

3

允許,因爲大多數的答覆是取代我更新了這個問題。在2012年第四季度,Appcelerator發佈了Alloy MVC(測試版)框架以及最新的IDE和SDK版本Titanium Studio 3.0和SDK 3.0。合金與Studio完全集成,因此在不到15分鐘的時間內就可以輕鬆獲得基本應用程序。合金引入了重要的文件夾重構:/app文件夾現在是所有開發代碼所在的位置。

/資源文件夾,其中使用的代碼居住,現在是的更新當量/建文件夾中。編譯代碼/Resources在每次構建時被覆蓋。

我創建了一個關於創建合金項目的簡短入門指南(截屏)。您可以通過我的保管箱文件夾查看它。

Create Alloy Project

+0

謝謝!你救了我,用這個信息拉出我的頭髮。 – 2014-09-14 23:56:58

+0

有沒有一種方法可以將控制器JavaScript分成多個文件,因此它不一定是一個長的.js文件? – 2014-09-14 23:58:42

+0

@JustinVincent不管你喜歡,你都可以分割你的控制器文件。只要確保在原始容器中「要求」它們即可。另外,讓他們以一種對你有意義的方式組織起來。如果將代碼從'foo.js'拆分爲'bar.js',並且foo需要知道它,只需將其添加到foo'var bar = require('bar.js')' – 2014-09-16 12:47:06