假设用户创建了一个带有几个 PhoneNumber 的新 Person。一切都通过一个表单完成,您可以在其中动态地将任意数量的 PhoneNumbers 添加到 Person 中。用户单击保存按钮,整个表单被提交到服务器,之后服务器返回保存响应。
重要的是,我不想将 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 子表单中的相应字段(因此在phones[1].phone 中有第二个电话号码由用户填写动态添加人形)。
我也不知道如何正确处理嵌入对象的服务器端验证。为了验证顶级对象(人),我返回与 JSON API 规范兼容的错误数据,如下所示:
{
"errors": [
{
"detail": "This value is invalid",
"source": {
"pointer": "data/attributes/firstName"
}
}
{...}
]
}
这适用于 Ember,最终我在模型中有错误,并且可以在模板中使用{{ get model.errors propertyName }}
. 但是如何返回引用嵌套对象的错误呢?不幸的是,我不知道。
我试图为我的难题寻求各种解决方案,但无济于事。不幸的是,我找不到任何关于这种情况的例子。但这似乎很基本。我错过了一些基本的东西吗?
我将非常感谢任何建议。谢谢。