1

假设用户创建了一个带有几个 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 }}. 但是如何返回引用嵌套对象的错误呢?不幸的是,我不知道。

我试图为我的难题寻求各种解决方案,但无济于事。不幸的是,我找不到任何关于这种情况的例子。但这似乎很基本。我错过了一些基本的东西吗?

我将非常感谢任何建议。谢谢。

4

0 回答 0