Ember.js:将控制器计算的属性从多个模型移动到一个新模型中



给定一个包含属性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次。

  1. 当它被引用时是模板
  2. 当加载CCD_ 11时
  3. 当加载CCD_ 12时

不是大问题(开销(,因为前两次,它将return null

第二(2(,模板中对特定测量的所有引用(例如:{{contents.oxigen.value}}(将实际显示undefined,直到在第三次computed迭代中计算出所有内容。在加载之前,我希望它不显示任何内容("(。

然而,我的最终目标是能够将substance(加上组合的measurements+elements(传递到像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}})
});
}

现在,内容将只计算一次,因为在解决这两个问题之前,控制器不会加载。无法定义测量值,因为数据已加载。

最新更新