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 创建自定义的命名空间。
posted @ 2012-11-28 21:52  Kiinlam  阅读(849)  评论(0编辑  收藏  举报