ArrayController 按属性和唯一过滤器的属性过滤



我有一个用于Foo对象的ArrayController,它与bar对象的关系具有"bar"属性。

var Foo = DS.Model.extend({
    bar    : DS.belongsTo('bar', {async:true})
});
var Bar = DS.Model.extend({
    foos   : DS.hasMany('foo', {async:true})
});

我对Foo数组中的唯一条形图有一个计算属性(有些Foo共享相同的条形图)。

var FooArray = Ember.ArrayController.extend({
    bars: function(){
       return this.get('content').getEach('bar');
    }.property("@each.bar"),
    unique_bars : function(){ 
      return Ember.A(_.uniq(this.get('bars'), function(c){return c.get('id');}));
   }.property("bars"),
});

由于Ember.Array.uniq不允许指定比较器,因此使用Undercore.uniq()。有Ember.Comparable混合元素,但这将为整个类定义一个唯一性比较器,我对此不感兴趣,因为我想在不同的情况下基于一些不同的属性找到唯一性。

寻找独特子属性的方法可能需要改进。无论如何,上述代码不能按预期工作:

foo_array.get('unique_bars')

生成一个包含1条的数组,尽管应该有20条。

Ember.A(_.uniq(foo_array.get('bars'), function(c){return c.get('id');}))

效果很好。20小节,从较大的数字中选出唯一的一组。

我相信"unique_bars"属性在第一个Foo添加到Foo_array后只计算一次。

那么观察者的表达可能有什么问题呢?或者{async:true}会干扰这一点吗?

您应该能够使用getEach来获取条和id,然后在id集合上使用uniq。然后你可以在每个栏上查看id

var FooArray = Ember.ArrayController.extend({
    bars: function(){
       return this.getEach('bar');
    }.property("@each.bar"),
    bar_ids : function(){ 
      return this.get('bars').getEach('id');
   }.property("bars.@each.id"),
   unique_ids: Em.computed.uniq('bar_ids')
});

示例:http://emberjs.jsbin.com/OxIDiVU/1102/edit

最新更新