我正在使用Ember 1.2.0和最新的Ember Data Beta,并且想知道如何处理服务器端错误(来自API调用)。
This question非常相似,但不起作用。
首先,becameInvalid
方法未触发。我正在使用ember-validations(我必须这么做吗?)
我的API发送了422状态代码并且响应如下:
{"errors":{"name":["has already been taken"],"initial":["has already been taken"]}}
model.js
Docket.Customer = DS.Model.extend( Ember.Validations, {
name: DS.attr('string'),
initial: DS.attr('string'),
description: DS.attr('string'),
validations: {
name: {
presence: true
}
},
becameError: function() {
alert('there was an error!');
},
becameInvalid: function(errors) {
alert("Record was invalid because: " + errors);
}
});
controller.js
Docket.OrganizationCustomersController = Ember.ArrayController.extend({
actions: {
save: function () {
var customer = this.store.createRecord('customer');
customer.set('name', this.get('name'));
customer.set('initial', this.get('initial'));
customer.set('description', this.get('description'));
customer.save().then(function() {
console.log('jeah')
}, function() {
console.log('nooo')
});
}
}
});
becameError
方法被触发,但becameInvalid
方法没有。
第二个问题:即使触发了错误,Ember.js也会将新记录添加到DOM中。我该如何防止这种行为?
答案 0 :(得分:1)
您的错误json没问题,我认为您使用的是DS.RESTAdapter
,并且它没有实现基于json的becameInvalid
错误。
目前只有DS.ActiveModelAdapter
已实施,因此我建议您将适配器配置更改为:
Docket.ApplicationAdapter = DS.ActiveModelAdapter;
答案 1 :(得分:0)
为了保留DS.RestAdapter,您可以使用ActiveModelAdapter中的方法覆盖其ajaxError方法。
至于今天,由于需要一些依赖性而略微适应的代码将是:
App.ApplicationAdapter = DS.RESTAdapter.extend({
// ... your own customizations,
ajaxError: function(jqXHR) {
var error = this._super(jqXHR);
if (jqXHR && jqXHR.status === 422) {
var response = Ember.$.parseJSON(jqXHR.responseText),
errors = {};
if (response.errors !== undefined) {
var jsonErrors = response.errors;
Ember.EnumerableUtils.forEach(Ember.keys(jsonErrors), function(key) {
errors[Ember.String.camelize(key)] = jsonErrors[key];
});
}
return new DS.InvalidError(errors);
} else {
return error;
}
}
});
显然,您有机会适应您的后端细节:HTTP代码(422不是标准代码)和格式。
资料来源: http://discuss.emberjs.com/t/how-to-handle-failure-to-save-on-server/3789