0

emberjsで簡単なブログアプリを作ろうとしています。このjsfiddleに見られるように、投稿のタイトルと本文を作成する機能は正常に機能します。

次に、個々の投稿をクリックしたときに表示されるコメント機能を追加したいと思います。ホームページで投稿をクリックし、個人のタイトルをクリックすると、コメントを追加するためのコメント ボックスが表示されます。

保存ボタンをクリックすると、次のエラーが表示されます

ember-data と rest adapter を使用するローカル開発環境で、次のエラーが発生します。

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に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。そのため、必ず関係を設定してください。

于 2013-03-20T17:43:37.890 に答える