小编Kaz*_*idi的帖子

EmberJS:在相当复杂的应用程序中,对模型,商店,控制器,视图的关注点有很好的分离?

我正在做一个相当复杂的emberjs应用程序,并将它绑定到API的后端.

API调用通常不依赖于任何特定模型,但可以在响应的不同部分返回各种类型的对象,例如,对事件API的调用将返回事件,但也返回参与这些事件的媒体资产和个人.

我刚刚开始介绍这个项目,我想获得一些关于如何最好地分离问题以获得干净的可维护代码库的专家指导.

我接近这个的方式是:

  • 模型:基本上处理包含其字段和其他计算属性的记录.但是,模型不负责提出请求.
    • 例如个人,事件,图片,帖子等
  • 商店:它们本质上是缓存.例如,a eventStore将存储从服务器到目前为止(从可能不同的请求)接收的所有事件,并且还存储在索引的事件的散列中id.
    • 例如individualStore,eventStore等.
  • 控制器:它们与一组相关的API调用相关联,例如,eventsController将负责获取事件或特定事件,或创建新事件等.它们会将响应"路由"到不同的stores以便以后检索.一旦将响应发送到商店,它们就不会保留响应.
    • 例如eventsController,userSearchController等.
  • 视图:它们与特定视图相关联.通常,我的应用程序可能在不同的位置具有多个视图,例如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/videoshttp://jzajpt.github.com/2012/01/17/emberjs-app-architecture.htmlhttp:/ /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.

model-view-controller store separation-of-concerns ember.js

10
推荐指数
1
解决办法
4367
查看次数

什么是在各种过滤选项之间切换的正确的emberjs方式?

我有一个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)

这在我对这些按钮的前两次三次点击中有效,但随后会冻结浏览器(有点无限循环?).

这对我来说也不是最好的选择.我是新来的,所以你说的任何东西都会有所帮助.提前致谢.

binding filter ember.js

4
推荐指数
1
解决办法
983
查看次数