在合金控制器中使用导出而不是将功能直接附加到' $'范围

时间:2015-06-09 03:19:49

标签: titanium-alloy commonjs

这是以两种不同方式编写的合金控制器的代码。虽然两者的作用相同,哪一个可能是最佳实践?

controller.js的示例1:

var currentState = true;
exports.getState = function(){
    return currentState;
}

controller.js的示例2:

[textView addObserver:self
           forKeyPath:@"text"
              options:NSKeyValueObservingOptionNew
              context:nil];

2 个答案:

答案 0 :(得分:1)

Titanium基于CommonJS框架。 exports变量是一个特殊变量,通常用于公开类对象中的公共API。因此,当您想在MyModule.js类上公开doSomething()方法时,您将使用如下的exports变量:

exports.doSomething() = function(args) {
  //Some really cool method here
};

然后使用

引用该类
var myModule = require('MyModule');
myModule.doSomething();

但是,在引用视图对象时,引用它的典型方法是使用$。捷径。您可以在官方文档中看到他们更喜欢这种方法。

http://docs.appcelerator.com/platform/latest/#!/guide/Alloy_XML_Markup

答案 1 :(得分:0)

$变量包含对控制器实例的引用。它还包含对所有索引视图的一些引用(理解,您在xml标记中为其提供索引的视图)。

两种方式都严格等同,因为在编译期间,Alloy会将exports的内容与$中引用的控制器合并。将它们直接添加到实例中不会改变事物。

无论如何,开发人员习惯将公共API视为通过特殊变量exports导出的函数集;因此,我建议以干净清晰的方式继续使用它(例如,在模块范围内定义函数,并仅在控制器的末尾或开头公开它们)。

function myFunction1 () { }
function myFunction2 () { }
function myFunction3 () { }


exports.myFunction1 = myFunction1;
exports.myFunction3 = myFunction3;

因此,对于潜入源代码的人来说,您的API非常清晰。 (强烈建议使用readMe文件:))。