我有以下设置:
| // IndexController contains array of search result objects
| IndexController (ArrayController)
| //Contains a search result object with row data (array) and search metadata
|---> ResultController (ObjectController)
| // Contains just the row data which is rendered into a sortable table
|--------> TableController (ArrayController)
IndexController
在用户启动搜索时从服务器检索对象列表。返回的每个对象都有一些关于搜索的元数据以及所有行数据。
使用索引模板中的{{#each}}
帮助程序呈现每个对象:
{{#each itemController="result"}}
{{view App.ResultView}}
{{/each}}
ResultView呈现元数据,然后使用{{render}}
帮助器呈现实际表格,如下所示:
<h2>{{pieceofMetaData}}</h2>
{{render "table" rows}}
由于我指定了模型(在本例中为行数据),{{render}}
助手为每个结果对象创建了TableController的实例。例如,如果IndexController模型中有3个结果对象,则会创建3个TableControllers。 TableController是一个ArrayController,可以利用ArrayController可以为我做的排序。在Table模板中,我自己渲染表:
<table>
<thead>
<tr>
<th>First Name</th>
<th>Last Name</th>
</tr>
</thead>
<tbody>
{{#each}} <!-- Each row of data is rendered here -->
<tr>
<td>{{firstName}}</td>
<td>{{lastName}}</td>
</tr>
{{/each}}
</tbody>
</table>
这很好但我现在遇到了一个问题。我需要能够从ResultController
内的TableController
访问属性。基本上ResultController
包含有关哪些列可排序的信息。我无法弄清楚如何从孩子ResultController
访问父TableController
。
我尝试在'TableController'中使用needs: ['result']
,但这只是实例化了ResultController
的新实例,而不是让我访问实际的父实例。
我在下面创建了一个工作的jsbin来设置我在这里描述的代码。
非常感谢任何帮助或建议!
最佳,
赤颈
答案 0 :(得分:3)
在您的情况下,我会使用PersonTableComponent,请检查example。使用渲染助手主要用于特定的路线上下文。我认为,你正在尝试利用&#39; sortProperties&#39;,#sort; sortAscending&#39;功能由Ember.SortableMixin提供,不幸的是,这个mixin似乎只能用于ArrayProxy实例,所以你需要在组件中实现排序功能。
<script type="text/x-handlebars" data-template-name="components/person-table">
<h3>{{header}} )</h3>
<table>
<thead>
<tr>
<th {{action 'toggleSortFirstName' }}>First Name</th>
<th {{action 'toggleSortLastName'}}>Last Name</th>
</tr>
</thead>
<tbody>
{{#each sortedPeople}}
<tr>
<td>{{firstName}}</td>
<td>{{lastName}}</td>
</tr>
{{/each}}
</tbody>
</table>
</script>
<script type="text/x-handlebars" data-template-name="index">
{{#each controller}}
{{person-table header=header people=rows}}
{{/each}}
</script>
App.PersonTableComponent = Ember.Component.extend({
sortProperty: 'lastName',
sortAscending: true,
sortedPeople: Em.computed(function(){
// define your sorting functionality
return this.get('people').sort( function(item) {
return -1;
});
}).property('people.@each', 'sortProperty', 'sortAscending'),
actions: {
toggleSortFirstName: function() {
var sortValue = !this.get('firstNameSortValue');
// save current sort state
this.set('fistNameSortValue', sortValue);
this.setProperties({sortProperty: 'firstName',
sortAscending: sortValue});
},
toggleSortLastName: function() {
var sortValue = !this.get('lastNameSortValue');
// save current sort state
this.set('lastNameSortValue', sortValue);
this.setProperties({sortProperty: 'lastName',
sortAscending: sortValue});
}
}
});
查看EmberJS指南部分Component和Rendering with helper。