2012-02-06 16 views
7

ember.jsライブラリを使い始めたばかりです。私はデータテーブルを表示したい、そして、各行の右側に、そのアイテムをテーブルから削除するための削除ボタンがある。私はこれをどうやって行うのか分かりません。ember.jsコレクションビュー内のアイテム固有のアクション

また、子ビュー(ItemView)を作成して{{#each ...}} ... {{/ each}}セクション内でインラインで使用しようとしましたが、ember.jsはItemViewはEmber.View.createを使用して定義されていますが、ItemViewではなくビュークラスです。それがなぜ機能していないのかも知りたいです。ドキュメントの#ブロックごとに子ビューを使用するためのサンプルコードでさえ、動作しません。

個々のItemを描画するためにItemViewという子ビューを宣言できたとしても、その特定のビューのremoveItemアクションを取得してitemsControllerコレクションからどのアイテムを削除するかを知ることはできません。子ビューがコレクションにバインドされているItemインスタンスを取得するビューのプロパティはありますか?

{{#each App.itemsController}} 
      <tr> 
       <td>{{itemName}}</td> 
       <td><a href="#" {{action "removeItem" on="click"}}>Delete</a></td> 
      </tr> 
{{/each}} 

そして、ここに私のjavascriptです:ここで

は、リストを持っている私のビューテンプレートの一部である最良の方法この場合

window.App = Ember.Application.create(); 

window.App.Item = Ember.Object.extend({ 
    itemName: "defaultItemName" 
}); 

window.App.itemsController = Ember.ArrayProxy.create({ 
    content: [] 
}); 

window.App.ListView = Ember.View.create({ 
    templateName: 'listView', 

    removeItem: function (event) { 
     // ??? How do I figure out what item 
     // the user wanted to remove? 
    } 
}); 

答えて

11

マイケルにリンクされたマイケルは、正しいアプローチを示し、それぞれの中に子のItemViewを使用しています。それがなぜあなたにとってうまくいかなかったのか分かりませんが、残念なことにあなたの質問からそのコードを削除しました。

Yehudaの回答の構文の一部が少し古くなっていますので、私はそれを更新し、あなたの質問に少し似ています。あなたはここでそれをチェックアウトすることができます:http://jsfiddle.net/wmarbut/67GQb/130/更新されたリンクを1/21/12をjsfiddleする)

それの推力が

Javascriptを

ハンドルバー

{{#each App.peopleController}} 
    {{#view App.PersonView personBinding="this"}} 
     <td>{{view.person.fullName}}</td> 
     <td><button {{action removeItem target="view"}}>Delete</button> 
    {{/view}} 
{{/each}} 

です

App.PersonView = Ember.View.extend({ tagName: 'tr', person: null, removeItem: function() { var person = this.get('person'); App.peopleController.removeObject(person); } }); 
+0

OK、私はこの方法をしようとすると、テンプレートエンジンは、私は{{#each内のビューテンプレートに入れどのや​​タグを無視しているようだと遊ぶことができます。.. 。}} ... {{/ each}}ブロック。それらを完全に取り除くだけです。それらは取り除かれた唯一のタグです。

+0

OK、この質問に回答するつもりです。テンプレートの問題は別の問題のようです。お返事ありがとうございます。 –

+0

@JeremyBell re:タグがありません。あなたは{{#each}}ブロックを '

'タグで囲んでいますか?そうでない場合は、「」と「​​」タグが削除されます。 –

-2

わからないが、私は入れていますアイテムインデックスまたはアイテム名をタグのプロパティとして使用し、jQueryを使用して取得します。

// template 
{{#each App.itemsController}} 
     <tr itemName="{{itemName}}"> 
      <td>{{itemName}}</td> 
      <td><a href="#" {{action "removeItem" on="click"}}>Delete</a></td> 
     </tr> 
{{/each}} 


// Javascript 
window.App.ListView = Ember.View.create({ 
    templateName: 'listView', 

    removeItem: function (event) { 
     var id = this.$().parent().parent().attr('itemName'); 
     ... 
    } 
}); 

これが役立ちます。

2

Tのおかげでom Whatmoreフィドル私は同じ質問に答えました。

trek introを読んだ後、personBinding="this"の代わりに、{{action removeItem person}}を使用して、動作を実行するオブジェクトを明示的に指定したいと思います。

<script type="text/x-handlebars"> 
<table> 
    {{#each person in App.peopleController}} 
     {{#view App.PersonView}} 
      <td>{{person.fullName}}</td> 
      <td><button {{action removeItem person}}>Delete</button> 
     {{/view}} 
    {{/each}} 
</table> 
</script> 

私はvar person = evt.context;を使用して人物オブジェクトを取得します。

App = Ember.Application.create(); 

App.Person = Ember.Object.extend({ 
    fullName: function() { 
     return this.get('firstName') + ' ' + this.get('lastName'); 
    }.property('firstName', 'lastName') 
}); 

App.peopleController = Ember.ArrayProxy.create({ 
    content: [App.Person.create({ firstName: "Yehuda", lastName: "Katz" }), 
    App.Person.create({ firstName: "Tom", lastName: "Dale" })] 
}); 

App.PersonView = Ember.View.extend({ 
    tagName: 'tr', 
    removeItem: function(evt) { 
     var person = evt.context; 
     App.peopleController.removeObject(person); 
    } 
}); 

あなたはこのフィドルjsfiddle.net/67GQb/127

+0

[ ArrayControllerドキュメンテーション](http://emberjs.com/api/classes/Ember.ArrayController.html)、概念的にはコントローラであるため、ArrayProxyではなくArrayControllerを使用することをお勧めします。 – penkovsky

関連する問題