Given a model substances
containing an attribute measurements
which is an array with objects. Every object is a measurement with some attributes like (int) value
. Second model elements
is a collection containing global data for all specific elements, such as average values.
I want every measurement to contain the respective element as an attribute, so I can pass it to components. E.g.:
I'm doing a single findAll(elements, {limit: 300})
once, so that every substance doesn't do dozens of requests to the jsonapi server.
I tried combining the two in model:substance
, but model:elements
is not available there (for obvious reasons). So I am doing this in the page controller like so:
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`
This works, but there are some problems. First (1), the contents:computed
fires 3 times.
- When it is referenced is the template;
- when
model.substance
is loaded; - when
model.elements
is loaded.
Not a big problem because the first two times, it will return null
.
Second (2), all references to a specific measurement in the template (e.g.: ) will literally display undefined
until everything is calculated in the 3rd iteration. I would like it to display nothing ('') until it is loaded.
However, my final goal is to be able to pass substance
(with the combined measurement
s + element
s) to a shopping-cart-like service
so you can compose your own list of substances, after which it can make calculations and show a summary, independent.
How do I move these controller:substance
computations to a self-contained item (model?) that can be passed around to services (3), given that I cannot do this inside model:substance
?
I cannot reference the controller:substance
from a service
, because controllers are singeltons.
Aucun commentaire:
Enregistrer un commentaire