我有一个基本的创建表单设置,它在名称字段上进行验证。表单的保存操作承诺优雅地保存错误:
actions: {
save: function(){
var route = this;
var createCampaign = this.store.createRecord("campaign", {
code: this.get("code"),
name: this.get("name"),
description: this.get("description"),
});
this.set("code",""),
this.set("name",""),
this.set("description",""),
// POST values to campaigns
createCampaign.save().then(function(c){
route.transitionToRoute("campaigns.view",c.id);
}, function(errors){
});
}
}
});
我的定义属性是:
TM.Campaign = DS.Model.extend({
name: DS.attr(),
code: DS.attr(),
description: DS.attr(),
});
我已经读过使用RESTAdapter,ajaxError
需要被覆盖,所以我添加了以下内容:
ajaxError: function(jqXHR){
var error = this._super(jqXHR);
if(jqXHR && jqXHR.status === 422){
var response = Ember.$.parseJSON(jqXHR.responseText);
errors = {}
if (response.errors){
var jsonErrors = response.errors;
Ember.keys(jsonErrors).forEach(function(key){
errors[Ember.String.camelize(key)] = jsonErrors[key]
});
}
return new DS.InvalidError(errors)
} else {
return error
}
}
来自API的响应结构如下:
{
"errors": {
"name": [
"The name field is required."
]
}
}
但出于某种原因,每当我尝试显示DS.Errors(使用console.log(route.get("errors")
)时,我都会得到未定义。就像Ember不知道响应中出现验证错误一样。
我还确保响应状态以422 Unprocessable Entity
的形式返回。任何人都能看到我错过的东西吗?
编辑:我已经能够创建一个JS Bin来演示我的问题:http://jsbin.com/xujari/2/
答案 0 :(得分:0)
你的jsBin略有修改:
http://jsbin.com/luwaqeyoca/1/edit?js,console,output
DS.InvalidError的描述从不说明在路线中设置错误。可靠的部分是它设置了拒绝承诺错误。如果属性具有加载错误键名称的属性,它还会在record
自设置一个错误属性(如果您的错误键为name
,则必须具有属性name
。在你的模型中)
createCampaign.save().then(function(c){
route.transitionToRoute("campaigns.view",c.id);
}, function(errors){
console.log(errors.errors.name); //from the promise error
console.log(createCampaign.get("errors.name")); //from your record
});
修改强>
这是根据您在评论中提到的修改后的bin http://jsbin.com/sokebuzumu/1/edit?html,js,output
您需要在控制器中创建一个空对象“errors”,如jsbin
createCampaign.save().then(function(c){
}, function(errors){
this.set("errors",createCampaign.get("errors"));
}.bind(this));
答案 1 :(得分:0)
我刚回答了关于Ember数据错误处理here的类似问题,该问题涉及与您的问题相关的错误处理的许多方面。
由于我的PR已合并到Ember Data,因此您不再需要覆盖适配器上的ajaxError处理。错误现在将正确应用于模型,因此您可以根据我之前的答案使用函数来引用错误。