我正在尝试使用emberjs创建一个简单的博客应用程序。如此 jsfiddle 中所示,为帖子创建标题和正文的功能很正常。
现在我想添加下一个评论功能,当您点击单个帖子时应该显示这些功能。在主页上,单击帖子然后单击个人的标题,应显示评论框以添加评论。
点击保存按钮时出现以下错误
在使用ember-data和其他适配器的本地开发环境中,我收到错误:
uncaught TypeError: Cannot call method 'commit' of undefined
在JSfiddle中使用夹具适配器和相同的代码,错误变为
TypeError: this.transaction is undefined this.transaction.commit();
文章/ show.handlebars
<script type="text/x-handlebars" data-template-name="posts/show">
<h1>Post</h1>
<p>Your content here.</p>
<h3> {{title}} </h3>
<h3> {{body}} </h3>
</br>
<p> {{#linkTo 'posts.index'}} back {{/linkTo}}</p>
<p> {{#linkTo 'posts.edit' content}} Edit the post {{/linkTo}}</p>
<br/>
<p> Add Comments</p>
{{render 'comment/new' comments}}
</script>
评论/ new.handlebars
<form {{action save on='submit'}}>
{{view Ember.TextArea valueBinding='body' placeholder='body'}}
<button type="submit"> Add comment </button>
</form>
EmBlog.CommentNewController = Em.ObjectController.extend({
needs: ['posts'],
addComment: function(){
post = this.get('controllers.postsShow').get('model');
comment = post.get('comments')
this.transaction = comment.get('store').transaction.createRecord({body: body});
},
save: function(){
this.transaction.commit();
}
});
EmBlog.Comment = DS.Model.extend({
body: DS.attr('string'),
post_id: DS.attr('integer')'
post: DS.belongsTo('EmBlog.Post')
});
有关如何解决此问题的建议,每次创建评论时都会包含post_id。
**Update**
这是 latest gist ,我保存评论时没有显示任何错误,但评论没有显示在页面上。似乎他们被默默地忽略了。
答案 0 :(得分:2)
DS.Store#transaction
是一个函数,而不是属性。它返回DS.Transaction
...但是,您立即在其上调用createRecord
,因此您实际上是在事务属性中存储该调用的结果(记录)。此外,createRecord
上的DS.Transaction
需要将类型作为第一个参数。
因为这是一个ObjectController,我们必须在类定义中定义我们的内部属性,否则它们将被传递给内容。
EmBlog.CommentNewController = Em.ObjectController.extend({
transaction: null,
然后在你的实际代码中:
var transaction = post.get('store').transaction();
if (transaction) {
this.set('transaction', transaction);
transaction.createRecord(EmBlog.Comment, {body: body});
} else { console.log('store.transaction() returned null'); }
然后:
this.get('transaction').commit();
请注意,评论不会自动限定为Post
,因此请务必设置您的关系。