我有一个用于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}会干扰这个吗?
答案 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')
});