考虑这个模型:
Grandparent
parents: DS.hasMany('parent')
Parent:
grandparent: DS.belongsTo('grandparent')
children: DS.hasMany('child')
Child:
parent: DS.belongsTo('parent')
我想将计算属性children
添加到Grandparent
模型,其中我期望有一组Child
模型(Grandparent.children =合并每个祖父母。父母。孩子)。
怎么做?
对于此示例数据:
Grandparent { id: 0, parents: [0, 1] }
Parent { id: 0, grandparent: 0, children: [0] }
Parent { id: 1, grandparent: 0, children: [1,2] }
Child { id: 0, parent: 0 }
Child { id: 1, parent: 1 }
Child { id: 2, parent: 1 }
我希望Grandparent.get('children')
返回带有ids [0,1,2]的孩子。
修改
App.Grandparent.reopen({
grandchildren: function(){
var result = [];
this.get('parents').forEach(function(parent) {
parent.get('children').forEach(function(child){
console.log('is this even called?');
result.push(child);
});
console.log('coz this is!');
});
return result;
}.property("parents", "parents.@each.children")
});
为什么第二个循环为空?我知道数据被加载了(ember inspector)..那么为什么它不能在这里访问?
EDIT2:
几乎就在那里!似乎列表是空的,因为它是一个promise数组(尚未解析),因此在代码执行时 - 它是空的!
grandchildren: function(){
var grandchildren = [];
this.get('parents').forEach(function(parent) {
var promiseArray = parent.get('children');
promiseArray.then(function() {
promiseArray.forEach(function(child){
grandchildren.push(child);
console.log(child);
});
});
});
return grandchildren;
}.property("parents", "parents.@each.children")
所以这段代码正确地在控制台日志中显示所有的孙子......但是!它仍然没有归还它们。这可能是出于同样的原因 - 当代码命中return grandparent
时它仍然是空的。我现在在想,有办法吗?
EDIT3:
问题的根源似乎是DS.hasMany('parent', { async: true })
和DS.hasMany('child', { async: true })
。我已经在原始问题中省略了异步部分,以使模型示例更加清晰。
EDIT4:
我已经通过从DS.hasMany中移除async: true
并使用this script正确加载它们而没有异步来解决了我的问题。
这解决了“空数组”(未解析的数组)的问题,并允许我访问属性。然后我做了以下代码(在MODEL的重新打开功能中):
grandchildren: function(){
var res = Ember.ArrayProxy.create({content: Ember.A()});
this.get('parents').forEach(function(parent){
res.pushObjects(parent.get('children').toArray());
});
return res;
}.property('parents', 'parents.@each.children')
它有效!耶!
下一步是使用从服务器获取的一些数据替换灯具。而且这些数据是异步的......所以我仍然需要一个有承诺的解决方案。
EDIT5:测试代码:
grandchildren: function(){
var res = Ember.ArrayProxy.create({content: Ember.A()});
this.get('parents').forEach(function(parent) {
var promiseArray = parent.get('children');
promiseArray.then(function() {
res.pushObjects(promiseArray.toArray());
});
});
return res;
}.property('parents', 'parents.@each.children')
答案 0 :(得分:2)
您可能正在寻找http://emberjs.com/api/classes/RSVP.html#method_all。
var promises = [];
this.get('parents').forEach(function(parent) {
promises.push(parent.get('children'));
});
return Ember.RSVP.all(promises).then(function(results) {
// return concatenated results
});
当你给孙子孙女打电话时,你会得到一个可以解决连锁结果的承诺。
将来看起来似乎会通过类似rails来支持hasMany。 https://github.com/emberjs/data/issues/120