由于我没有为 Titanium 移动项目找到合适的 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"
}
}
之后,我们可以在 app.js 文件中使用 Ti.include() 包含所有需要的模型/视图/控制器类,并使用我们的命名空间引用组件:
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 的确切定义可能会根据您的个人喜好而有所不同;)