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

jd.*_*jd. 1 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('...')
})
Run Code Online (Sandbox Code Playgroud)

visible物业是在电脑上PlayerItemController,但我希望有从可见玩家的全局计数visibleCountPlayersController.我该如何实现这一目标?

这是我尝试过的:

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

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

Kin*_*n2k 5

您可以完全从阵列控制器实例本身触发它,因为这itemController是定义的位置.每当您尝试迭代this阵列控制器内部时,您将获得单独的项目控制器.

这一点与您在模板上下文中考虑时一样多.如果迭代控制器,则会得到项目控制器

{{#each item in controller}}
  yay I have an item controller
{{/each}}
Run Code Online (Sandbox Code Playgroud)

而如果您只是迭代模型/内容,那么您只需获得该记录

{{#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')
});
Run Code Online (Sandbox Code Playgroud)

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

如果你以它实现的方式来考虑它,那真的很酷.本质上,数组控制器会覆盖它如何将项目从控制器返回给您.当你尝试获取时objectAt(1),如果你已经定义了itemController它,它将包装底层对象itemController并返回它.或者,如果您尚未定义itemController,则只返回该对象.大多数人只是坚持它只是在模板中实现的方式,但只是它的一半,它是数组控制器如何将对象返回给你.

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