ArrayController按属性&属性过滤独特的滤镜

时间:2014-09-26 19:13:35

标签: ember.js

我有一个用于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})
});

我有一个计算属性,用于在Foos数组中找到的唯一条形图(一些Foos共享相同的条形图)。

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不允许你指定比较器,所以使用了Underscore.uniq()。有Ember.Comparable mixin,但是这将为整个类定义一个唯一性比较器,这对我不感兴趣,因为我想在不同情况下根据某些不同的属性找到唯一性。

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

foo_array.get('unique_bars')

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

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

工作得很好。 20个酒吧,从更大的数字中独特设置。

我相信'unique_bars'属性只会在第一个Foo添加到foo_array后评估一次。

那么观察者表达式会出现什么问题呢?或者{async:true}会干扰这个吗?

1 个答案:

答案 0 :(得分:2)

您应该能够使用getEach获取条形图和ID,然后在ids集合上使用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