When defining attributes on Ember Data models, you can specify a default value through the second argument to attr():
import Model, { attr, belongsTo } from '@ember-data/model';
export default class MetricSelectionModel extends Model {
@attr('string', { defaultValue: 'GB' }) unit;
@belongsTo('metric', { async: false }) metric;
}The defaultValue option can also be a function. This can be useful for when you want the default value of an attribute to be an object.
import Model, { attr } from '@ember-data/model';
export default class UserModel extends Model {
@attr({
defaultValue() {
return {};
},
})
preferences;
}If we didn't use a function here for defaultValue, all user instances would reference the same object, which usually isn't the desired behavior.
Using a function for defaultValue can also be useful to conditionally set a default value. Although not documented at the time of this writing, I recently discovered that the first parameter passed to the defaultValue function is the instance of a model. This can be used to conditionally set the default value based on other attributes or relationships. For example:
import Model, { attr, belongsTo } from '@ember-data/model';
export default class MetricSelection extends Model {
@attr('string', {
defaultValue(metricSelection) {
if (metricSelection.get('metric.type') === 'usage') {
return 'GB';
} else {
return null;
}
},
})
unit;
@belongsTo('metric', { async: false }) metric;
}In an analytics reporting application I am working on, users can select multiple metrics and specify a unit for some of those metrics for how they want to see the data in their report. In the code above, there is a model called metric-selection, which has a unit string attribute and a metric relationship. The default value of unit is determined based on metric, which can be accessed off of metricSelection, the metric-selection instance, passed to the defaultValue function.
Thanks to @runspired for confirming that it is part of public API that the defaultValue function receives an instance of the model as its first parameter.

