假设用户创建了一个包含几个PhoneNumbers的新Person。一切都通过一个表单完成,您可以根据需要动态地向Person添加尽可能多的PhoneNumbers。用户单击保存按钮,整个表单将提交给服务器,之后将从服务器返回保存响应。
重要的是,我不想将PhoneNumbers与Person分开保存。我希望操作是原子操作 - 所有内容都在一个请求中一起发送,并且一切都在服务器端验证并在一个事务中一起保存,或者没有任何内容被保存并返回错误数据。
现在,为了实现它,我在我的控制器中有一个savePerson动作,我做了很多这样的事情:
person.get('phoneNumbers').setObjects([]);
phones.forEach((phone) => {
if (!!phone.phone) {
var p = null;
if (!phone.id) {
p = that.store.createRecord('phoneNumber', {
'person': person,
'number': phone.phone
});
person.get('phoneNumbers').pushObject(p);
} else {
p = that.store.peekRecord('phoneNumber', phone.id);
p.person = person;
p.number = phone.phone;
person.get('phoneNumbers').pushObject(p);
}
}
});
{...}
person.save().then(function() {
{...}
that.store.unloadAll('phoneNumber'); //needs to be done to remove records created by createRecord - their saved duplicates will come back after model reload
{...}
})
在上面的示例中,在phones
数组中有常规的非模型对象,其属性绑定到Person形式的PhoneNumber子表单中的相应字段(因此在phone [1] .phone中有第二个电话号码由填写Person表单的用户动态添加。)
我也不知道如何正确处理嵌入对象的服务器端验证。为了验证顶级对象(Person),我返回与JSON API规范兼容的错误数据,如下所示:
{
"errors": [
{
"detail": "This value is invalid",
"source": {
"pointer": "data/attributes/firstName"
}
}
{...}
]
}
这适用于Ember,最终我在模型中出现错误,可以使用{{ get model.errors propertyName }}
在模板中检索它们。 但是如何返回引用嵌套对象的错误?不幸的是我不知道。
我试图为我的难题寻求各种解决方案,但无济于事。我不幸地找到关于这种情况的任何例子。但它似乎很基本。我错过了一些基本的东西吗?
我将非常感谢任何建议。感谢。