【发布时间】: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