如何在 Appcelerator Titanium 项目中组织 JS 文件

Posted

技术标签:

【中文标题】如何在 Appcelerator Titanium 项目中组织 JS 文件【英文标题】:How to organize JS files in a Appcelerator Titanium project 【发布时间】:2011-02-04 03:22:07 【问题描述】:

我最近开始使用 Appcelerator 的 Titanium 创建一个 iPhone 应用程序。由于该应用程序基本上都是 JS,因此我需要一些关于如何组织这个项目的建议。

为应用程序中的每个视图创建长的程序文件变得非常容易。有没有办法可以将 MVC 或某些结构合并到项目中?

谢谢,我很感激。 -蒂洛

【问题讨论】:

虽然这个问题仍然相关,但请注意,有些答案已经过时了:到目前为止,教程和官方文档中提到了一些模式——甚至是很好的旧示例应用程序 KitchenSink(又名 King of鼠窝)已经过重构,以更好地反映当前的良好实践。 【参考方案1】:

Titanium 本身本质上是 MVC,因为您的 app.js 文件是主控制器,并且您创建的每个视图都是视图,并且您针对视图传递(或设置)模型数据。

在 Titanium 中,您可以使用一些不错的内置机制来分解您的应用程序:

    Titanium.include - Titanium.include 允许您包含一个或多个 JS 文件,就像 C #include 编译器指令一样。您可以将常用函数和 JS 类放在此文件中,然后将它们包含在您希望它们导入和可用的任何位置。

    Titanium.UI.createWindow - 您可以创建一个新视图作为新窗口的属性,将 URL 传递给另一个 JS 上下文,这将创建一个新的 JS 子上下文并允许您维护自己的变量空间(但仍然允许您访问您的父母)。

此外,在 Titanium 中,您可以创建文件夹,以便以适合您和您的应用程序的方式合理地组织您的应用程序。

编辑:今天,Titanium.Include 方法已被弃用。 正如文档中提到的,我们应该创建一个 CommonJS 模块并使用 require() 语句。

有关此声明的更多信息:Require

关于模块的更多信息:Modules

【讨论】:

我会反对这种说法 (请忽略我上面的评论,我不能再删除它了:/)@jhaynie,我会反对 Titanium 本身本质上是 MVC 的说法。在处理所谓的经典 Titanium 项目时,几乎没有强制执行结构。具体来说,没有控制器或模型。您可以提出自己的结构并使其类似于 MVC,但经典方法本身并不是 MVC。另一方面,钛合金(尽管在您发布答案时尚未发布)是一个 MVC 框架。它强制执行特定的项目结构并提供真正的关注点分离。【参考方案2】:

请允许我更新此问题,因为大多数回复已被取代。 2012 年第四季度,Appcelerator 发布了 Alloy MVC(测试版)框架以及最新的 IDE 和 SDK 版本、Titanium Studio 3.0 和 SDK 3.0。 Alloy 与 Studio 完全集成,因此很容易在 15 分钟内运行一个基本应用程序。 Alloy 引入了重要的文件夹重组:/app 文件夹现在是所有开发代码所在的位置。

过去存放代码的 /Resources 文件夹现在是 /build 文件夹的更新版本。 /Resources 中的编译代码在每次构建时都会被覆盖。

我创建了一个关于创建 Alloy 项目的简短介绍性入门(截屏视频)。您可以通过我的 Dropbox 文件夹查看它。

Create Alloy Project

【讨论】:

谢谢!你用这些信息救了我拔头发。 有没有办法可以将控制器 javascript 拆分为多个文件,这样它就不必是一个长的 .js 文件? @JustinVincent 您可以随意拆分控制器文件。只要确保在原始容器中“要求”它们。此外,以对您有意义的方式将它们组织起来。如果您将代码从 foo.js 拆分为 bar.js 并且 foo 需要知道它,只需添加到 foo var bar = require('bar.js') @JustinVincent 更正:对于require,它应该是var bar = require('bar');。不要添加文件扩展名。然后,在foo.js 中,您可以使用bar.doStuff(); 引用条码【参考方案3】:

看起来 Appcelerator 在市场上创建了自己的Appcelerator MVC,我还没有对此进行评估。

更多信息:http://johnkalberer.com/2011/09/29/appcelerator-mvc-example/

【讨论】:

【参考方案4】:

由于我没有为 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 的确切定义可能会根据您的个人喜好而有所不同;)

【讨论】:

喜欢您的解决方案。以同样的方式做到了,并取得了很好的经验。 非常喜欢并且非常想使用它。如何在我的应用中使用它? 我喜欢这个。 2014 非合金版本的区别是否仅在于使用 require() 而不是 Ti.include()? 对于那些迟到的人,Ti.include() 已被贬值。【参考方案5】:

这也可能有所帮助:如何组织 Titanium 移动项目的基本结构:https://github.com/krawaller/Struct

【讨论】:

这是一个有用的 blog post,它解释了 GitHub 存储库中发生的事情。

以上是关于如何在 Appcelerator Titanium 项目中组织 JS 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在Android中使用Appcelerator Titanium构建Oauth 2.0

Appcelerator Titanium 中面向 OOP 的 CommonJS

Commonjs - 在 Appcelerator 中使用 Titanium 将数据从一个窗口移动到另一个窗口

Titanium appcelerator 未列出 iPhone 以在开发模式下加载应用程序

iOS LocationManager 未更新位置(Titanium Appcelerator 模块)

Titanium Appcelerator SubView 在 IOS 中不起作用