我一直在谷歌搜索和搜索Stack Overflow以获取某些关于此主题的暗示,但信息最多只是分散。
我正在尝试创建一个新的子记录(Comment
)并将其保存到现有的父记录(Post
)。我使用的是Ember-Model,而不是Ember-Data,但是我会非常感谢任何提示或指示。
目前,在使用 new Comment
创建新的嵌入式Post
但 时,我已成功创建记录。所以:
如何加载/检索当前加载的Post
(父记录)以便将Comments
(子记录)应用于它?
我一直在阅读控制器依赖项,使用needs:
和this.controllerFor
以及this.modelFor
来访问另一个控制器/模型的content
,但一直无法访问把这些东西连在一起形成有意义的东西。
无论如何,这就是我将我的应用程序代码缩减到的地方,希望我能够偶然发现这样做的正确方法......
App.Router.map(function() {
this.resource('post', { path: '/:post_id' }, function() {
this.resource('comments', { path: '/comments'} );
});
});
我删除了所有其他资源&路线,所以我留下了App.Post
,App.PostIndex
和App.Comments
。我认为我的路由是这里的问题,我假设我没有正确实现在我的Post
路由中使用加载的Comments
记录的方法。
App.IndexRoute = Ember.Route.extend({
model: function() {
return App.Post.find();
},
setupController: function(controller, model) { // I'm not certain if this
controller.set('content', model); // setupController is needed?
}
});
App.PostRoute = Ember.Route.extend({
model: function(params) {
return App.Post.find(params.post_id);
},
setupcontroller: function( controller, model) { // again, unsure if this
this.controllerFor('post').get('comments'); // is correct.
controller.set('content', comments);
}
});
App.CommentsRoute = Ember.Route.extend({
afterModel: function() {
this.set('post', this.modelFor('post'));
},
setupcontroller: function( controller, model) {
this.controllerFor('post').get('comments');
controller.set('content', comments);
}
});
App.CommentsController = Ember.ArrayController.extend({
needs: "post",
actions: {
addComment: function() {
var post = App.Post.create({
title: 'static post title'
});
post.get('comments').create({
message: 'static message'
});
post.save();
}
}
});
这是我当前的评论控制器,可以使用嵌入式Post
创建新的Comment
。我已经找到并给出了许多创建Comment
的例子,但似乎没有一个适合我。基本上,我正在努力将var post = ...
定义为当前加载的记录。我尝试了各种方法尝试试用&错误。到目前为止,我尝试过:
var post = App.Post.create();
,返回属性undefined,因为这会创建一个新记录。但是,我给了它一个镜头,因为我看到与此相关的每个例子都定义了它们的记录。
var post = this.get('post');
,返回一个无法在未定义时调用'get'。我尝试过使用这种方法在Comments
控制器和Post
控制器上定义我当前的帖子。
var post = this.get('controllers.post.content);
,从我正在使用的后端返回“循环错误”。
var post = App.Post.find();
,返回一个无法在未定义时调用'get'。
var post = App.Post.find(1);
,再次,返回一个无法在未定义时调用'get'。想我会试一试,因为这是人们提供的那些反复出现的例子之一。我使用的后端将自己的ID应用于每条记录,我不确定我是否能够/如何让.find()
方法使用动态ID值并仅检索刚加载的模型。
我猜我没有正确设置路由和控制器依赖关系?
如果有人有建议,相关链接或修复,我将非常感激。
这一个(看似简单的)问题/用例让我在这一点上结束了。
答案 0 :(得分:1)
试试这个(适用于测试版2):
App.CommentsController = Ember.ArrayController.extend({
actions: {
addComment: function() {
this.content.createRecord({
message: 'static message'
});
}
}
});
Ember Data Beta 2及更高版本:
App.CommentsController = Ember.ArrayController.extend({
needs: ["post"],
actions: {
addComment: function() {
var post = this.get('controllers.post');
var comment = this.get('store').createRecord('comment', {
message: 'static message',
post: post
});
comment.save().then(function() {
post.addObject(comment);
// You may or may not need to save your post, too. In my case my backend handles
// the inverses of relationships (if existing), so there's no need. We still need
// to do this for Ember, though
});
}
}
});