Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Ember.js中使用其他嵌套对象正确保存和验证模型对象?_Javascript_Ember.js_Ember Data_Json Api_Server Side Validation - Fatal编程技术网

Javascript 如何在Ember.js中使用其他嵌套对象正确保存和验证模型对象?

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(

假设用户用几个电话号码创建了一个新人。一切都是通过一个表单完成的,在这个表单中,您可以根据需要动态地向此人添加任意数量的电话号码。用户单击save按钮,整个表单被提交到服务器,然后服务器返回save响应

重要的是,我不想把电话号码和人分开保存。我希望操作是原子的——所有内容都在一个请求中一起发送,或者所有内容都在服务器端验证并在一个事务中一起保存,或者什么都不保存并返回错误数据

现在,为了实现这一点,我在控制器中有一个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
    {...}
})
{
    "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}
在模板中检索它们但是如何返回引用嵌套对象的错误?不幸的是,我不知道

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

如果有任何建议,我将不胜感激。谢谢