【发布时间】:2015-12-08 11:14:55
【问题描述】:
我正在重写我的应用程序以符合 Ember 2,但在尝试重构 ItemController 时遇到了一个大问题。
目前我有一个 arrayController 有一个项目数组。用户有许多可供选择的用于对显示的数据进行排序的选项。 有些排序直接依赖于控制器上设置的属性(由用户通过模板提供)。为此,我目前声明了一个项目控制器,这意味着我可以创建一个计算属性来计算我需要的排序值。这不能通过模型上的 computedProperty 来完成,因为模型不知道已设置的控制器属性。
如何重构它以不使用 itemControllers - 我不知所措。
我将一些代码 sn-ps 放在一起试图解释我的意思。我正在尝试对 itemController 属性 numberOfSelectedFruit 进行排序,每个“人”的值将取决于控制器上的 selectedFruit 属性(从模板中提取)。这是一个愚蠢的例子,但我认为它说明了问题。
我非常感谢任何关于 ember 2 方式的帮助(我也看不出组件如何提供帮助)
// model
APP.Person = DS.Model.extend({
name: DS.attr('string'),
// Not proper code, but to show the structure of the fruit field
fruit: [{type: DS.attr(‘string’), number: DS.attr(‘number’}]
})
// person_controller
APP.PersonItemController = Ember.ObjectController.extend({
numberOfSelectedFruit: function() {
var parentController = this.get('parentController');
var fruitType = parentController.selectedFruit;
var numberOfFruit = 0;
this.get(‘fruit’).forEach(function(aFruit) {
if(aFruit.type === fruitType) {
numberOfFruit++;
}
});
return numberOfFruit;
}
})
APP.PersonController = Ember.ArrayController.extend({
itemController: 'PersonItem',
sortingOn: 'name',
selectedFruit: 'orange',
sortedPeople: Ember.computed.sort('filteredContent', 'sortingOn'),
})
编辑以添加模板代码
模板代码可以像下面这样简单,带有一个选择器来选择“水果”(这将在控制器上设置 selectedFruit 属性。
// person.hbs
<table>
<tbody>
{{#each sortedPeople as |person|}}
<tr>
<td>{{person.name}} {person.numberOfSelectedFruit}</td>
</tr>
{{/each}}
</tbody>
</table>
【问题讨论】:
-
请出示您的模板代码。
-
编辑添加简单的模板代码。它不包括选择排序字段或“fruitType”(来自示例)的所有元素,因为我觉得这只会混淆示例。
标签: ember.js