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 绑定。保持类的定义不包含绝对路径将明显改善你的程序。
Thinking like a robot