我们已在项目中成功实施了1对多关系,但我不确定我们的实施是最佳实践。我们目前的设置详述如下:
Contact Model:
name: DS.attr('string'),
telephones: DS.hasMany('telephone', { async: false}),
Telephone Model:
number: DS.attr('string'),
contact: DS.belongsTo('contact', { async: true}),
注意:电话上的异步是假的,因为我们将它与联系人一起加载。
以下代码用于保存具有电话号码的新联系人:
ContactController:
var newContact = this.get('model').createRecord('contact');
newContact.set('name', 'John');
var newTel1 = this.get('model').createRecord('telephone');
newTel1.set('number', '555-1234');
newContact.get('telephones').pushObject(newTel1);
var newTel2 = this.get('model').createRecord('telephone');
newTel2.set('number', '555-6789');
newContact.get('telephones').pushObject(newTel2);
newContact.save().then(function() {
var telephones = newContact.get('telephones');
telephones.forEach(function(telephone){
telephone.set('contact', newContact);
telephone.save();
});
});
此代码最初不起作用,因为服务器对联系人POST的响应有一个空的电话阵列(因为电话尚未保存在服务器上)。这导致ember将联系人的电话关系设置为null,并且在联系人保存之后将forEach循环设置为0个元素。所有电话都丢失了。然后我们通过创建一个联系人序列化器来修复它:
extractCreateRecord: function(store, type, payload, id, requestType) {
delete payload.contact.telephones;
return this._super(store, type, payload, id, requestType);
},
实施序列化程序后,我们现在可以使用电话号码成功保存新联系人。然而,这并不是直觉上最好的解决方案 - 这是最好的方法还是可以做得更好?
我们正在使用RestAdapter并且在Ember 1.9上。 Ember Data 1.0.0-beta.12和Handlebars 2.