【问题标题】:ArrayController filtering by property of property & unique filtersArrayController 按属性和唯一过滤器的属性过滤
【发布时间】:2014-09-26 19:13:34
【问题描述】:

我有一个用于 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"),

});

Underscore.uniq() 在那里使用,因为 Ember.Array.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} 会干扰这个?

【问题讨论】:

    标签: ember.js


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      • 2013-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多