Ember:数组控制器中的属性,根据项目控制器的属性计算

时间:2014-06-25 19:53:49

标签: ember.js

我有一个典型的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上的计算机,但我想要visibleCountPlayersController的全局可见玩家数。我如何实现这一目标?

这是我尝试过的:

visibleCount: function(){
  return this.get('content').filter(function(p){
    return p.get('visible')
  }).length;
 }.property('content.@each.visible'),

这不起作用,因为p.get('visible')每次都返回undefined,并且该属性返回0

1 个答案:

答案 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,它只会将对象返回给您。大多数人只是坚持它只是在模板中实现的方式,而只是它的一半,它是阵列控制器如何将对象返回给你。

示例:http://emberjs.jsbin.com/dalazawe/2/edit