我正在做一个相当复杂的emberjs应用程序,并将它绑定到API的后端.
API调用通常不依赖于任何特定模型,但可以在响应的不同部分返回各种类型的对象,例如,对事件API的调用将返回事件,但也返回参与这些事件的媒体资产和个人.
我刚刚开始介绍这个项目,我想获得一些关于如何最好地分离问题以获得干净的可维护代码库的专家指导.
我接近这个的方式是:
eventStore
将存储从服务器到目前为止(从可能不同的请求)接收的所有事件,并且还存储在索引的事件的散列中id
.
stores
以便以后检索.一旦将响应发送到商店,它们就不会保留响应.
latestEventsView
在仪表板上除了具有单独的事件页面之外.通常,我的模板需要直接绑定到商店(例如,peopleView
想要列出列表中的IndividualStore中的所有个体,按某种顺序排序).
有时,它们绑定到计算属性
alivePeople: function () { ... }.property('App.individualStore.content.@each'),
Run Code Online (Sandbox Code Playgroud)
视图中"选择"的各种过滤和排序选项应从商店返回不同的列表.你可以看到我的最后一个问题是什么是在各种过滤选项之间切换的正确的emberjs方式?
谁应该做这个过滤,视图本身或商店?
跨层的这种绑定是否合适,还是代码味道?关注点分离是好的,还是我错过了什么?控制器不应该在这里做更多的事情吗?我的观点应该直接绑定到商店吗?
任何特殊的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
.
我有一个individualStore(从Em.ArrayController扩展),其任务是保留一个单独的对象数组.我的应用程序调用了几个API,它们返回发送到商店的单个对象.将其视为我的应用程序中缓存的单个记录的数据库.
App.individualStore = App.ArrayController.create({
allIndividuals: function () {
return this.get('content').sort(function (a, b) {
return (b.votes_count - a.votes_count);
});
}.property('@each.votes_count').cacheable(),
aliveIndividuals: function () {
return this.get('content').filter(function (individual) {
return (!!individual.living);
}).sort(function (a, b) {
return (b.votes_count - a.votes_count);
});
}.property('@each.living', '@each.votes_count').cacheable(),
deceasedIndividuals: function () {
return this.get('content').filter(function (individual) {
return (!individual.living);
}).sort(function (a, b) {
return (b.votes_count - a.votes_count);
});
}.property('@each.living', '@each.votes_count').cacheable()
});
Run Code Online (Sandbox Code Playgroud)
我的观点有一个`individualBinding:'App.individualStore.allIndividuals',它按照预期完美呈现.
我想添加过滤按钮,例如Show: All | Alive | Deceased
.在这里更改过滤的正确方法是什么?请记住,无论标准是什么,我都希望它始终与individualStore保持同步.
有人建议在运行时更改绑定,
this.bind('users', Ember.Binding.from('App.individualStore.aliveIndividuals'));
Run Code Online (Sandbox Code Playgroud)
这在我对这些按钮的前两次三次点击中有效,但随后会冻结浏览器(有点无限循环?).
这对我来说也不是最好的选择.我是新来的,所以你说的任何东西都会有所帮助.提前致谢.