Javascript 如何在Ember.js中使用其他嵌套对象正确保存和验证模型对象?
假设用户用几个电话号码创建了一个新人。一切都是通过一个表单完成的,在这个表单中,您可以根据需要动态地向此人添加任意数量的电话号码。用户单击save按钮,整个表单被提交到服务器,然后服务器返回save响应 重要的是,我不想把电话号码和人分开保存。我希望操作是原子的——所有内容都在一个请求中一起发送,或者所有内容都在服务器端验证并在一个事务中一起保存,或者什么都不保存并返回错误数据 现在,为了实现这一点,我在控制器中有一个savePerson操作,在这里我做了如下可怕的事情:Javascript 如何在Ember.js中使用其他嵌套对象正确保存和验证模型对象?,javascript,ember.js,ember-data,json-api,server-side-validation,Javascript,Ember.js,Ember Data,Json Api,Server Side Validation,假设用户用几个电话号码创建了一个新人。一切都是通过一个表单完成的,在这个表单中,您可以根据需要动态地向此人添加任意数量的电话号码。用户单击save按钮,整个表单被提交到服务器,然后服务器返回save响应 重要的是,我不想把电话号码和人分开保存。我希望操作是原子的——所有内容都在一个请求中一起发送,或者所有内容都在服务器端验证并在一个事务中一起保存,或者什么都不保存并返回错误数据 现在,为了实现这一点,我在控制器中有一个savePerson操作,在这里我做了如下可怕的事情: person.get(
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
{...}
})
{
"errors": [
{
"detail": "This value is invalid",
"source": {
"pointer": "data/attributes/firstName"
}
}
{...}
]
}
在上面的示例中,在phones
数组中,有一些常规的非模型对象,其属性绑定到Person表单中PhoneNumber子表单中的相应字段(因此在phones[1]中,phone是由用户在Person表单中动态添加的第二个电话号码)
我也不知道如何正确处理嵌入式对象的服务器端验证。为了验证顶级对象(Person),我返回与JSON API规范兼容的错误数据,如下所示:
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
{...}
})
{
"errors": [
{
"detail": "This value is invalid",
"source": {
"pointer": "data/attributes/firstName"
}
}
{...}
]
}
这与Ember一起工作,最终我在模型中有了错误,可以使用{{get model.errors propertyName}
在模板中检索它们但是如何返回引用嵌套对象的错误?不幸的是,我不知道
我试图寻找各种各样的办法来解决我的难题,但都无济于事。不幸的是,我找不到任何关于这种情况的例子。但这似乎很基本。我错过了一些基本的东西吗
如果有任何建议,我将不胜感激。谢谢