Emberjs——命名约定
原文:http://www.emberist.com/2012/04/09/naming-conventions.html
对初学者来说,一个常见的问题是Ember中的命名问题。正确的命名不仅能保持代码整洁,对应用的操作还有特殊作用。
何时大写
Ember中的大写规则相当直接。如果是一个类或命名空间,使用大写字母开头;如果是一个实例,使用小写字母开头。命名空间是唯一必须声明为全局变量的对象,类和实例必须总在命名空间上声明。举例来说:Ember和你的应用程序是命名空间(技术上来说,应用程序是一个实例,但在功能上,它是作为命名空间来使用的),Ember.Object 和 Ember.View 是类,而 MyApp.personController 和 myObj 是实例。
使用这种命名约定的第一个原因是,它可以很简单找出处理的对象种类。如果它使用小写字母开头,它是一个实例,如果是大写开头,它是类或命名空间。
第二个原因,更为重要,正因为这种约定,Ember能对你的代码做出一些假设,并更加智能的输出结果。
属性绑定中的大写
运行以下的代码:
MyApp.controllerOne = Ember.Object.create({ value: 'one' }); MyApp.controllerTwo = Ember.Object.create({ Constant: 'const', valueHash: { value: 'two' }, valueBinding: 'valueHash.value', valueOneBinding: 'MyApp.controllerOne.value', constBinding: 'Constant' }); // Sync our bindings. Not necessary in normal use. Ember.run.sync(); MyApp.controllerTwo.get('value'); // two MyApp.controllerTwo.get('valueOne'); // one MyApp.controllerTwo.get('const'); // undefined
如果你对Ember有了基础的认识,你应该明白为何 value 和 valueOne 返回各自关联的值。然而,你也想对 const 返回未定义很惊讶。原因很简单:Ember碰到大写字母开头了,会假定它是一个命名空间,然后在全局变量中查找 Constant ,很明显,它是未定义的。
怎样取得本地属性呢?所需要做的只是加上前缀 this 。修改绑定为:
constBinding: 'this.Constant'
这会告诉Ember在当前对象查找,而不是全局。
模板中的大写
考虑如下javascript脚本:
window.myProp = 'prop'; MyApp.controllerOne = Ember.Object.create({ value: 'one', Constant: 'const' }); MyApp.controllerTwo = Ember.Object.create({ value: 'two', });
以及模板:
{{#with MyApp.controllerOne}} {{value}} {{Constant}} {{MyApp.controllerTwo.value}} {{myProp}} {{/with}}
这将输出下面内容:
one const two
如果你仔细观察,你会发现跟属性绑定的例子有些变化。当Ember遇到模板中的属性时,它会在当前上下文检查是否存在该属性,在这个例子中,上下文是 MyApp.controllerOne。如果属性未定义,Ember会检查它是否以大写字母开头。如果是这样,便假设它是一个命名空间,然后在全局中查找。这在 MyApp.controllerTwo.value 上出现。Ember不会对小写开头的属性进行全局搜索,如例子中的 myProp。
更多关于命名空间
另一个好玩的技巧是创建你自己的命名空间。正如之前提到的,应用程序实际上也是一个命名空间。Ember.Application 是 Ember.Namespace 的一个子类。也许你会疑惑为何需要一个自定义命名空间类。为什么不用 MyNamespace = {} ?当你尝试检查你的对象时就知道 Ember.Namespace 带来的好处了。比如:
NamespaceOne = {}; NamespaceOne.Object = Ember.Object.extend(); NamespaceTwo = Ember.Namespace.create(); NamespaceTwo.Object = Ember.Object.extend(); NamespaceOne.Object.toString(); // (subclass of Ember.Object) NamespaceTwo.Object.toString(); // NamespaceTwo.Object
正如你所看到的,当你使用 Ember.Namespace,能让 toString 提供更多对象的信息。通过一点创造性的代码可以做到,扫描 window 下 Ember.Namespace 的实例,然后,依次检查每一个实例的属性。
总结
记住以下规则:
- 对命名空间和类使用大写开头。
- 对实例,属性,其他变量,使用小写开头。
- 少数情况下需要绑定大写开头的属性,使用前缀 this。
- 使用 Ember.Namespace 创建自定义的命名空间。