Ember組件是實現您所需功能的好方法。享受此working example
下面是所有這些如何工作。您的新指數的路線:現在
<script type="text/x-handlebars" data-template-name="index">
<ul>
{{#each user in model}}
{{user-details user=user selectedUser=controller.selectedUser action='changeSelected'}}
{{/each}}
</ul>
</script>
用戶正在使用user-details
組件顯示:
<script type="text/x-handlebars" data-template-name="components/user-details">
<p class="pointer" {{action 'clickedUser'}}>{{user.id}}</p>
<ul {{bind-attr class=hideDetails:hidden}}>
<li>{{user.detail}}
</ul>
</script>
和邏輯:
App.UserDetailsComponent = Ember.Component.extend({
hideDetails: function(){
if(this.get('selectedUser') !== this.get('user')){
return true;
}else{
return false;
}
}.property('selectedUser'),
actions: {
clickedUser: function(){
this.sendAction('action', this.get('user'));
}
}
});
該組件在三個屬性通過。用戶對象,一個動作字符串(對應於控制器上的動作名稱,以及我們在控制器上定義的selectedUser對象)。單擊用戶名稱時,會觸發組件上名爲'clickedUser'的動作。這個動作發送動作'action',這是一個傳遞給組件的屬性,這個屬性對應於控制器上一個動作的名字,並且傳遞給它一個參數:剛剛被點擊的用戶對象:
App.IndexController = Ember.ArrayController.extend({
selectedUser: null,
actions: {
changeSelected: function(user){
this.set('selectedUser', user);
}
}
});
現在這個changeSelected將selectedUser
設置爲剛剛被點擊的用戶。我們每個組件的每一個都有一個計算屬性,它遵守控制器的selectedUser
屬性:
hideDetails: function(){
if(this.get('selectedUser') !== this.get('user')){
return true;
}else{
return false;
}
}.property('selectedUser')
因此,更改控制器上的selectedUser
將使每個組件重新評估此屬性。如果selectedUser
不是該組件顯示的用戶,則hideDetails返回true。請注意組件中我將屬性<ul {{bind-attr class=hideDetails:hidden}}>
綁定到了詳細信息列表。冒號表示如果hideDetails的計算結果爲true,則將css類hidden
設置爲ul
。 css是:
.hidden{
display: none;
}
因此,除了最後一個選擇的用戶之外,每個單獨的明細列表都是隱藏的。如果您有任何問題,請告訴我!