如果大多数人在加载嵌入式Ember模型时遇到问题,我就会遇到完全相反的问题。
当我尝试解析包含embedded
关系的记录时,Ember会抛出错误,其中hasMany
关系的内容为空数组。
如何使嵌入式Ember数据将多个关系设为可选或可空?
我有一个模特..
App.Beat = DS.Model.extend({
notes: DS.hasMany('note', {
embedded: 'always',
defaultValue: []
}),
...
})
此模型是Bar
模型中的关联,它是Track
模型中的关联。那些在这里真的不重要。
这些嵌入的hasMany
关系使用以下序列化程序进行序列化。
// http://bl.ocks.org/slindberg/6817234
App.ApplicationSerializer = DS.RESTSerializer.extend({
// Extract embedded relations from the payload and load them into the store
normalizeRelationships: function(type, hash) {
var store = this.store;
this._super(type, hash);
type.eachRelationship(function(attr, relationship) {
var relatedTypeKey = relationship.type.typeKey;
if (relationship.options.embedded) {
if (relationship.kind === 'hasMany') {
hash[attr] = hash[attr].map(function(embeddedHash) {
// Normalize the record with the correct serializer for the type
var normalized = store.serializerFor(relatedTypeKey).normalize(relationship.type, embeddedHash, attr);
// If the record has no id, give it a GUID so relationship management works
if (!normalized.id) {
normalized.id = Ember.generateGuid(null, relatedTypeKey);
}
// Push the record into the store
store.push(relatedTypeKey, normalized);
// Return just the id, and the relation manager will take care of the rest
return normalized.id;
});
}
}
});
}
});
成功反序列化并加载商店中的记录后,应用程序中的某个位置bars
上的Track
属性被访问。如果Bar
beats
中有一个beats
没有任何notes
(因为它是没有播放音符的休息节拍),那么以下错误是Ember.assert("...", Ember.A(records).everyProperty('isEmpty', false));
抛出:
"你抬起了酒吧'关系''但是没有加载一些相关的记录。要么确保它们都与父记录一起加载,要么指定关系是异步的(DS.hasMany({async:true}))"
此错误来自ember-data.js中的以下断言:hasRelationship:
records
其中bars
是notes
的数组,其中包含可选包含embedded
的节拍。
那么,如何制作hasMany
{{1}}关系可选,以便接受一个空的记录数组?
答案 0 :(得分:1)
我建议在最近的Ember Data测试版(10或11)中使用EmbeddedRecordsMixin
,然后查看您是否仍然遇到嵌入式记录问题。
您的应用程序序列化程序:
App.ApplicationSerializer = DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin,{
// probably nothing required here yet
});
然后在你的Beat模型序列化器中:
App.BeatSerializer = App.ApplicationSerializer.extend({
attrs: {
notes: { embedded: 'always' }
}
});
答案 1 :(得分:0)
它转变为我的isEmpty
模型上的bar
与在Ember断言中测试的属性冲突。重命名此属性使一切正常。