我有一个modelA
,modelB
和modelC
。 modelA
具有许多modelB
,modelB
属于modelA
,modelB
属于modelC
。
下面是我的component.js
上的计算属性,下面的代码是我想获取modelA
id等于baz.id的所有modelC
foo: computed('modelA', 'baz.id', function() {
return this.get('modelA').filter((a) => {
return a.get('modelB').filter((b) => {
let userId = b.get('modelC.id');
let bazId = this.get('baz.id');
if (userId === bazId) {
return b;
}
})
});
}),
问题:我没有得到正确的答复。回应不符合我的期望。
问题:我是否根据想要的情况正确实现了计算属性,即我想获得modelA
id等于modelC
baz.id
感谢任何回应。谢谢
答案 0 :(得分:-1)
Ola @Mikelemuel,谢谢您的提问?
我很难理解您要问的问题difficulty我将首先列出我认为您要问的问题,然后按照我的理解继续回答问题。
首先,您说I want to get all the modelA where the modelC id is equal to the baz.id
,这很难理解。首先,我建议您不要称这些为modelA
等,因为这样很难弄清楚您要问的是什么,很难用一个答案来表达。如果您可以给我这些型号的适当名称,我将在此答案中对其进行更新。
根据我对您的人际关系的了解,这是我创建的设置:
// app/models/model-a.js
import DS from 'ember-data';
export default DS.Model.extend({
children: DS.hasMany('modelB'),
})
// app/models/model-b.js
import DS from 'ember-data';
export default DS.Model.extend({
parent: DS.belongsTo('modelA'),
sibling: DS.belongsTo('modelC'),
})
// app/models/model-c.js
import DS from 'ember-data';
export default DS.Model.extend({
sibling: DS.belongsTo('modelB'),
})
我从对您所提供的关系的描述中构建了这些模型。如果它们不正确,或者您对每个属性名称都有一个更好的名称,请告诉我。
现在重新表述您要查找的查询:
我要过滤所有模型-a(这是主要查询) 任何同级的孩子的ID都等于this.baz的ID。
以此,我创建了一条简单的路由,该路由仅创建了一些虚拟数据。这对答案并不重要,但对查看我要实现的目标很有用:
// app/routes/application.js
import Route from '@ember/routing/route';
export default Route.extend({
model() {
let result = this.store.createRecord('model-a');
let children = [
this.store.createRecord('model-b', {
parent: result
}),
this.store.createRecord('model-b', {
parent: result
})
];
this.store.createRecord('model-c', {
id: 'five',
sibling: children[1]
});
return [result];
}
});
,因此我们可以创建您在控制器中描述的计算属性:
// app/controllers/application.js
import Controller from '@ember/controller';
import { computed } from '@ember/object';
export default Controller.extend({
baz: computed(function() {
return {
id: 'five',
}
}),
foo: computed('model', 'baz.id', function() {
let result = this.model.filter((item) => {
return item.children.find((child) => {
return child.get('sibling.id') === this.get('baz.id');
})
});
return result;
}),
});
首先,您将看到我有一个baz
计算属性,我将使用它来使this.get('baz.id')
返回某些内容。我想象在您的用例中,您将this.baz
设置为动态对象。
接下来您将注意到,我在函数中使用了filter()
和find()
的混合体。值得提醒自己checking out the JavaScript documentation的filter()
的工作原理,但实际上,您需要为要包含在结果中的数组中的项目返回一个 truthy 值。
要提供此真实值,我们使用JavaScript find,它将找到所提供函数的结果为真实的第一个实例。
我已经在本地进行了测试,并且可以按预期运行(基于我对您问题的理解)。
我希望这会有所帮助?