使用ember-data-1.0.0-beta.10我正在使用以下模型扩展。
只需调用model.reloadRelationship(name)
where name 是表示关系的模型属性的名称。
这适用于普通和链接 belongsTo/hasMany 关系。
DS.Model.reopen({
reloadRelationship: function(name) {
var meta = this.constructor.metaForProperty(name),
link = this._data.links ? this._data.links[meta.key] : null;
if (!link) {
if (meta.kind === 'belongsTo') {
this.get(name).then(function(model) { model.reload(); });
} else {
this.get(name).invoke('reload');
}
} else {
meta.type = this.constructor.typeForRelationship(name);
if (meta.kind === 'belongsTo') {
this.store.findBelongsTo(this, link, meta);
} else {
this.store.findHasMany(this, link, meta);
}
}
}
});
这里唯一缺少的是一些检查,例如,在使用链接重新加载模型时检查模型是否已经重新加载,或者检查属性名称是否存在于当前模型中。
编辑 ember-data-1.0.0-beta.14:
DS.Model.reopen({
reloadRelationship: function(key) {
var record = this._relationships[key];
if (record.relationshipMeta.kind === 'belongsTo') {
return this.reloadBelongsTo(key);
} else {
return this.reloadHasMany(key);
}
},
reloadHasMany: function(key) {
var record = this._relationships[key];
return record.reload();
},
reloadBelongsTo: function(key) {
var record = this._relationships[key];
if (record.link) {
return record.fetchLink();
} else {
record = this.store.getById(record.relationshipMeta.type, this._data[key]);
return record.get('isEmpty') ? this.get(key) : record.reload();
}
}
});
HasMany 关系将回退到本机重新加载方法。
对于 BelongsTo 关系,它会首先检查记录是否需要重新加载(如果之前没有加载,它只会调用 get 来检索记录,否则会调用重新加载)。