我是客户端Javascript MVC的新手,第一个是ember.js app。
我按照这里的说明使用ember-rest创建嵌套模型的后评论类型。
http://www.cerebris.com/blog/2012/01/26/beginning-ember-js-on-rails-part-2/
我开始编写嵌套资源,如下所示:
resources :conversations do
resources :comments
end
现在问题是当我必须编写余烬控制器时:
App.commentsController = Ember.ResourceController.create({ resourceType:App.Comment resourceURL:'/ conversation /:id / comments' });
我认为我不能在中间使用:id;我怎么能解决这个问题? ember-data能解决这个问题吗?似乎spine.js集成将更容易处理这个。提前谢谢!
答案 0 :(得分:6)
我一直想从昨天开始回复你对我的帖子的评论,所以我很高兴你在这里提出这个问题。
我首先要说的是,我将ember-rest写为jQuery.ajax上的一个非常薄的层。它不是非常先进,甚至没有内置的协会设施。但是,我正在考虑添加一个,因为这个lib正在得到一些使用。正如您将从下面的代码中看到的那样,可以处理这个概念,但应该在lib中更好地抽象。
可以通过在每个父资源中创建资源控制器的实例来处理关联。每个特定资源控制器应该管理特定的资源数组,但不一定是特定类型的所有资源。
在您的情况下,您可以扩展ResourceController以管理对话的注释:
App.ConversationComments = Ember.ResourceController.extend({
resourceType: App.Comment,
// override _resourceUrl() to base the url on the conversation
_resourceUrl: function() {
return this.get("conversation")._resourceUrl() + "/comments";
}
});
然后,您可以为每个对话配置ConversationComments实例:
App.Conversation = Ember.Resource.extend({
resourceUrl: '/conversations',
resourceName: 'conversation',
resourceProperties: ['prop1', 'prop2']
// init comments
init: function() {
this.set("comments", App.ConversationComments.create({ conversation: this }));
}
});
最后但并非最不重要的是,您需要检索每个对话的评论:
conversation.get("comments").findAll();
如果您拥有json中的所有注释,则可以使用loadAll()。调用loadAll()或findAll()的位置和时间取决于您的应用程序的需求。显然,您需要减少ajax调用的次数以获得最佳性能。
Ember-data是一个比ember-rest更雄心勃勃的项目,并且已经支持协会以及交易等高级功能。话虽如此,它正在通过不断变化的API进行非常积极的开发。如果您耐心并愿意深入研究代码,我强烈建议您尝试一下。当尘埃落定时,我也计划在博客上发表文章。