在尝试处理Ember应用程序中的服务器端错误时,我无法在模板中显示错误,因为模型未填充收到的错误。
使用的版本:
Ember-cli:2.4.3
灰烬数据:2.4.2
适配器:RESTAdapter
模板文件包含用户注册表单,如下所示:
{{input type="text" value=username }}
{{#each model.errors.username as |error|}}
{{error.message}}
{{/each}}
{{input type="text" value=email }}
<button {{action 'register'}}>Register</button>
routes文件包含用于保存用户的操作'register':
register: function(){
var username = this.controller.get('username');
var email = this.controller.get('email');
var user = this.store.createRecord('user',{
email: email,
username: username
});
user.save().then(function(){
//handle success
},function(error){
//handle error
});
});
模型如下:
export default Model.extend({
email: attr(),
username: attr()
});
我正在使用的API以状态422响应并显示错误:
{
"errors":[
{
"detail":"can't be blank",
"source":{
"pointer": "/data/attributes/username"
}
}
]
}
根据DS.Errors的文档,可以通过访问其属性名称来显示错误,以获取该属性的所有错误对象的数组。这就是我在模板文件中尝试做的事情 此外,我尝试访问错误对象上的messages属性,但没有成功。
{{#each model.errors.messages as |message|}}
{{message}}
{{/each}}
当我尝试在控制台上登录错误的长度属性,即
user.save().then(function(){
//handle success
},function(error){
//handle error
console.log(user.get('errors.length'));
});
它总是给我0.但是
console.log(user.get('errors.username.length'));
给出了所需的输出,但仍然在模板中看不到错误 尝试覆盖RESTAdapter中的ajaxError,如本文24027053中所述,但没有运气 我不知道我做错了什么。请帮助!
答案 0 :(得分:1)
我不知道这是否是最好的方式,但这对我有用:
save(model) {
model.save()
.then(() => {
console.log('success');
})
.catch(() => {
if (model.get('errors.messages.length') > 0) {
model.get('errors.messages').forEach((message) => {
console.log(message);
});
} else {
console.log('failed');
}
});
}
在模板中,我可以通过
访问错误{{#each model.errors.messages as |error|}}
<div class="error">
{{error}}
</div>
{{/each}}
答案 1 :(得分:0)
我认为错误在于:
user.save().then(function(){
//handle success
},function(error){
//handle error
console.log(user.get('errors.length'));
});
用户未保存,因此没有错误。试试这个:
user.save().then(function(){
//handle success
},function(error){
//handle error --> how do you handle it? Are you maybe overriding the default behaviour?
// you might want to put a 'debugger;' statement here in order to see, what the response actually looks like
console.log(error.errors);
});
答案 2 :(得分:0)
通过设置包含错误的模型解决了问题。看起来DS.Errors在填充错误后没有设置模型。
现在我的注册功能如下:
var route = this;
user.save().then(function(){
//handle success
},function(error){
var errors = user.get('errors');
route.set('_model.errors',errors);
});
并且路径文件中的模型钩子是:
_model:{},
model(){
return this.get('_model');
}
注册函数使用错误填充_model,模型钩子返回_model,以便在视图中可用。