我正在开发一个相当复杂的emberjs应用程序,并将其与API后端进行绑定。
API调用通常不与任何特定模型相关联,但可能在响应的不同部分中返回各种类型的对象,例如,对事件API的调用将返回事件,还会返回媒体资产和参与这些事件的个人。
我刚刚开始这个项目,希望得到一些专家指导,以便将关注点分离,使代码库保持清洁易维护。
我的做法是:
- Models: 主要处理记录及其字段和其他计算属性。但是,模型不负责发送请求。
- 例如:Individual、Event、Picture、Post等
- Stores: 本质上是缓存。例如,
eventStore
将在数组中存储迄今为止从服务器接收到的所有事件(可能来自不同的请求),并以事件的id为索引在哈希表中存储。- 例如:individualStore、eventStore等
- Controllers: 它们绑定到一组相关的API调用,例如,eventsController将负责获取事件或特定事件,或创建新事件等。它们将响应“路由”到不同的
stores
,以供以后检索。一旦已将响应发送到stores,它们不会保留响应。- 例如:eventsController、userSearchController等
- Views: 它们与特定视图绑定。通常,我的应用程序可能在不同的位置具有几个视图,例如,在仪表板上的
latestEventsView
以及单独的事件页面。 - Templates:就是模板。
相当多的时间,我的模板需要直接绑定到stores(例如,peopleView
希望在列表中列出individualStore中的所有个人,按某种顺序排序)。
有时,它们会绑定到计算属性。
alivePeople: function () { ... }.property('App.individualStore.content.@each'),
在视图中选择的各种过滤和排序选项应该从存储中返回不同的列表。您可以查看我上一个问题,网址为what is the right emberjs way to switch between various filtering options?
这个过滤是由视图自己完成还是由存储完成?
这种跨层绑定是否可以接受?或者说它是代码异味吗?分离关注点好还是我漏掉了什么?控制器在这里应该做更多的事情吗?我的视图应该直接绑定到存储吗?
MVC的哪种特殊情况更适合我的需求?
更新于2012年4月17日:我的研究正在进行中,尤其是从http://vimeo.com/user7276077/videos和http://jzajpt.github.com/2012/01/17/emberjs-app-architecture.html和http://jzajpt.github.com/2012/01/24/emberjs-app-architecture-data.html。
我已经发现了一些设计问题:
- 控制器发出请求(存储或模型等应该处理,而不是控制器)
- 状态图表丢失——它们对于视图-控制器交互非常重要(在一段时间后,您会意识到您的交互不再简单)
这是一个关于状态图表的很好的例子:https://github.com/DominikGuzei/ember-routing-statechart-example
更新于2013年1月9日
是的,这个问题问得已经有点久了,但最近还有很多人查看这个问题,这就是为什么我想编辑它,以便人们能够理解。
自此问题发布以来,Ember的情况发生了很大变化,新的指南改进了很多。EmberJS制定了约定(像Rails一样),MVC现在更加明确。
任何仍然感到困惑的人都应该阅读所有指南,并观看一些视频: 西雅图Ember.js Meetup
目前,我正在将我的应用程序升级到Ember.js 1.0.0-pre2
。