0

我正在尝试使用 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**

这是最新的要点,当我保存评论但评论没有出现在页面上时,它不会显示任何错误。似乎他们被默默地忽略了。

4

1 回答 1

2

DS.Store#transaction是一个函数,而不是一个属性。它返回一个DS.Transaction... 但是,您正在createRecord立即调用它,因此您实际上将该调用的结果(一条记录)存储在您的事务属性中。此外,createRecordon aDS.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,因此请确保设置您的关系。

于 2013-03-20T17:43:37.890 回答