1

itemcontroller を使用して、コメントのリストをレンダリングし、コメントに対して CRUD を実行したいと考えています。CRUDの側面は正常に機能します。ただし、うまく機能しないことが 2 つあります。以下に説明します。ここにjsfiddleがあります。コメント追加ボタンをクリックするだけで、既存の編集フォームの下に追加の編集フォームが追加されます。

  1. ボタンをクリックして、CommentNewController を使用する newComment を作成すると、EmBlog.CommentEditController とコメント編集フォームが新しいコメントのフォームと一緒に自動的にレンダリングされます。両方のフォームはそれぞれ独立しており、異なるコントローラーとテンプレートを使用しているため、newComment のフォームをレンダリングすると editComment の空のフォームが自動的に追加される理由がわかりません。

  2. 2 番目の問題は、#if ヘルパーで囲まれた編集ボタンがあることです。#if ヘルパーが true の場合、編集フォームが表示されます。#if ヘルパーを true に切り替えるために、{{action editComment }} を含むボタンを作成しました。ボタンをクリックすると、編集フォームがレンダリングされません。ただし、テンプレートが最初にレンダリングされると、編集ボタンがクリックされていなくても、編集フォームが自動的に表示されることに注意してください。

関連するテンプレートとコントローラーを以下に貼り付けます。

編集ボタンがクリックされるのを待たずに編集フォームが自動的に表示されるのは、post/show テンプレートがレンダリングされるときです。これにより、#if ヘルパーが true に設定されます。

<script type="text/x-handlebars" data-template-name="posts/show"> 
   //displays the add button link
    {{render 'comment.New' }} 
   <br/>

  **render the comments and use CommentEdit as itemController**
  {{render 'comments' comments}}
 </script>

コメント テンプレート

  <script type='text/x-handlebars' data-template-name='comments'>
    <ul>
      {{#each controller  itemController="CommentEdit"}}
    <li>{{body}}</li><br/>
      {{partial 'comment/edit'}} 
    {{/each}}
   </ul>  
 </script>

編集ボタンをクリックせずにフォームがレンダリングされ、編集ボタンをクリックしても何もしないため、この#ifヘルパーがバイパスされているようです

<script type='text/x-handlebars' data-template-name='comment/_edit'>
 {{#if controller.editComment}}
   {{#if model}}
     <form {{action save content on='submit'}}>
      {{view Ember.TextArea valueBinding="content.body" placeholder="body"}}
     <button type="submit"> save comment </button>  
     <button {{action cancel content}}> Cancel</button>
    </form>
  {{/if}}
{{/if}}
<br/>
<div>
  <button {{action editComment }} {{bindAttr disabled="isEditingComment"}}> Edit Comment</button>

addComment ボタンをクリックすると、新しい空の編集フォームが追加されますが、編集フォームを呼び出すことさえできません。

 <script type='text/x-handlebars' data-template-name='comment/new'>
   {{#if controller.isAddingNew}}
    {{partial 'comment'}} 
   {{/if}} 
  <div>
   <button {{action addComment}} {{bindAttr disabled="isAddingNew"}}>Add Comment</button>
 </div>
</script>

新しいコメントを追加するためのコメント パーシャル

 <script type='text/x-handlebars' data-template-name='_comment'>
  <form {{action save content on='submit'}}>
  <button {{action cancel content}}> Cancel</button>
  </form>
 </script>

コントローラー

EmBlog.CommentNewController = Em.ObjectController.extend({
   needs: ['postsShow'],
   isAddingNew: false,

   addComment: function(){ 
    this.set('isAddingNew', true);
   }  
 });

 EmBlog.CommentEditController = Em.ObjectController.extend({
   isEditingComment: false,

   editComment: function() {
    this.set('isEditingComment', true);
  }
});

EmBlog.CommentsController = Em.ArrayController.extend({
 needs: ['postsShow'],
 itemController: 'CommentEdit'
});

ありがとう。

mike's answer に基づいて jsfiddle を動作させます。Emberjs1.0Rc-6 を使用するようにember-data実装を更新し、CommentNewController はここで説明されているように、 Kris Seldon のバッファリングされた保存をを回避します: イベントrootState.loaded.updated.inFlightを処理しようとしました。同じコードですが、ember-data の代わりにember-model をデータストアとして使用: http://jsfiddle.net/TVe4X/4/および Emberjs 1.0.0-RC6 と現在の ember-model を使用するように更新: http://jsfiddle.net /tHWM4/5/willSetProperty

4

1 に答える 1