给定一个包含属性measurements
的模型substances
,该属性是一个包含对象的数组。每个对象都是一个具有(int) value
等属性的度量。第二个模型elements
是一个集合,包含所有特定元素的全局数据,例如平均值。
我希望每个度量都包含相应的元素作为属性,这样我就可以将其传递给组件。例如:
{{#each contents as |m|}}
{{some-graph m}}
{{some-chart m}}
{{some-data m}}
{{/each}}
我只做了一次findAll(elements, {limit: 300, reload: false})
,这样每个实体就不会对jsonapi服务器进行几十次请求。因此route:substance
的模型是:
model(params) {
return {
substance : this.store.findRecord('substance', params.substance_id),
elements : this.store.findAll('element', {limit: 300, reload: false}})
}
},
我尝试在model:substance
中组合两者,但model:elements
在那里不可用(原因很明显(。所以我在controller:substance
中这样做:
export default Controller.extend({
substance : computed.alias('model.substance'),
measurements : computed.alias('substance.measurements'),
elements : computed.alias('model.elements'),
contents : computed('{elements,measurements}.[]', function() {
if (!this.get('elements')) return null
if (!this.get('measurements')) return null
return this.get('measurements').map(m => {
const element = this.get('elements').find(detail => detail.id == m.id)
if (element) set(m, 'element', element)
return m
})
}),
// More calculations w/ `utils` here based on `contents`
这是可行的,但也存在一些问题。首先(1(,contents:computed
发射3次。
- 当它被引用时是模板
- 当加载CCD_ 11时
- 当加载CCD_ 12时
不是大问题(开销(,因为前两次,它将return null
。
第二(2(,模板中对特定测量的所有引用(例如:{{contents.oxigen.value}}
(将实际显示undefined
,直到在第三次computed
迭代中计算出所有内容。在加载之前,我希望它不显示任何内容("(。
然而,我的最终目标是能够将substance
(加上组合的measurement
s+element
s(传递到像service
这样的购物车上,这样你就可以编写自己的物质清单,之后它可以进行计算并显示摘要,而不依赖于你当前的路线/控制器。
如果我不能在model:substance
中执行此操作,我如何将这些controller:substance
计算移动到可以传递给服务的自包含项目(模型?((3(?
我不能从service
引用这个controller:substance
,因为控制器是单体的。
如果在显示任何数据之前需要解析所有数据,则可以使用RSVP.hash,只有在两个promise都已解析时才能解析。
import { hash } from 'rsvp';
model(params) {
return hash({
substance : this.store.findRecord('substance', params.substance_id),
elements : this.store.findAll('element', {limit: 300, reload: false}})
});
}
现在,内容将只计算一次,因为在解决这两个问题之前,控制器不会加载。无法定义测量值,因为数据已加载。