Emberjs——类中的绝对路径

原文:http://www.emberist.com/2012/04/30/absolute-paths-in-classes.html

 

在很多新手创建的Ember应用中,有个很常见的错误--在类定义中使用绝对路径。本文将解释为何这样做是不好的,以及应该怎么做。这不是技术问题,而是一种良好设计的方式。

绝对路径

当提到绝对路径这个术语时,意味着一个指向全局变量的路径。在Ember中,这种全局变量通常用首字母大写标识。更多信息参阅文章“命名约定”。

什么不该做

下面的例子会帮助你明白现在讨论的事情,这个例子是一种不好的设计方式,请不要这样做。

JavaScript:

MyApp.currentUserController = Ember.Object.create({
  user: null
});

MyApp.UserView = Ember.View.extend({
  templateName: 'user',
  contentBinding: "MyApp.currentUserController.user"
});

HTML:

<script type="text/x-handlebars" data-template-name="user">
  {{content.name}}
</script>

<script type="text/x-handlebars">
  Current User: {{view MyApp.UserView}}
</script>

问题出在哪?

为什么这样做不好?不好的地方在于,没有保持关注点适当的分离。定义的视图类不需要知道应用程序的结构。它不需要知道user的值来自何处。而且,如果你打算重用 UserView ,并赋予不一样的值,你又得重写已经设定好的绑定。

更好的方式

下面例子展示更好的设计方式,问题将变得更清晰。

JavaScript:

MyApp.currentUserController = Ember.Object.create({
  user: null
});

MyApp.UserView = Ember.View.extend({
  templateName: 'user',
  content: null
});

HTML:

<script type="text/x-handlebars" data-template-name="user">
  {{content.name}}
</script>

<script type="text/x-handlebars">
  Current User: {{view MyApp.UserView
                  contentBinding="MyApp.currentUserController.user"}}
</script>

例子所做的,是让 UserView 不再关注 user 来自何处。它所需要关心的是它有一个带有 name 属性的 content。在应用程序的根视图,我们只需要确保提供正确的 user 给指定的 UserView 的实例,而不是将它硬编码到类的定义中。现在不仅分离了关注点,代码也变得可重用,UserView 不再被 current user 绑定。保持类的定义不包含绝对路径将明显改善你的程序。

posted @ 2012-11-28 21:58  Kiinlam  阅读(745)  评论(0编辑  收藏  举报