我有一个典型的ArrayController
/ ObjectController
设置如下:
App.PlayersController = Ember.ArrayController.extend({
itemController: 'playerItem',
visibleCount: function(){
//How do I compute this property?
}.property(...),
});
App.PlayerItemController = Ember.ObjectController.extend({
needs: 'players',
visible: function(){
...
}).property('...')
})
visible
属性是PlayerItemController
上的计算机,但我想要visibleCount
中PlayersController
的全局可见玩家数。我如何实现这一目标?
这是我尝试过的:
visibleCount: function(){
return this.get('content').filter(function(p){
return p.get('visible')
}).length;
}.property('content.@each.visible'),
这不起作用,因为p.get('visible')
每次都返回undefined
,并且该属性返回0
。
答案 0 :(得分:5)
您可以完全从阵列控制器实例本身触发此操作,因为这是定义itemController
的位置。每当您尝试迭代阵列控制器内的this
时,您将获得各个项目控制器。
因为当你在模板的上下文中考虑它时,这同样有用。如果迭代控制器,则会得到项目控制器
{{#each item in controller}}
yay I have an item controller
{{/each}}
如果您只是迭代模型/内容,那么您只需获得该记录
{{#each item in model}}
boo, boring model
{{/each}}
App.PlayersController = Ember.ArrayController.extend({
itemController: 'playerItem',
visibleItems: Em.computed.filterBy('','visible', true),
// you don't need this below, you could just do, `visibleItems.length` in the template
visibleCount: Em.computed.alias('visibleItems.length'),
// showing off getting item controller
randomProp: function(){
this.forEach(function(ic){
console.log(ic.get('visible'));
});
}.property('@each.visible')
});
示例:http://emberjs.jsbin.com/dalazawe/1/edit
如果按照它的实施方式来考虑它,那真的很酷。本质上,数组控制器会覆盖它如何将项目从控制器返回给您。当您尝试获取objectAt(1)
时,如果您已定义itemController
,它将在itemController
中包装基础对象并将其返回。或者,如果您还没有定义itemController
,它只会将对象返回给您。大多数人只是坚持它只是在模板中实现的方式,而只是它的一半,它是阵列控制器如何将对象返回给你。