Ember.js 保存模型时,是否可以处理余烬数据中的自定义服务器端错误
保存模型时是否有适当的方法处理自定义错误?举个例子,假设我有一个只有两个属性“name”和“value”的模型。当我这样做的时候:Ember.js 保存模型时,是否可以处理余烬数据中的自定义服务器端错误,ember.js,ember-data,grails-2.0,Ember.js,Ember Data,Grails 2.0,保存模型时是否有适当的方法处理自定义错误?举个例子,假设我有一个只有两个属性“name”和“value”的模型。当我这样做的时候: var myModel = this.get('store').createRecord('myModel', {"name": "someName", "value": "someValue"}); myModel.save().then(function() { //if success //server responded with {"myM
var myModel = this.get('store').createRecord('myModel', {"name": "someName", "value": "someValue"});
myModel.save().then(function() {
//if success
//server responded with {"myModel:{"id":1,"name":"someName","value":"someValue"}"}
},function() {
//if failure
//server responded with {"error":"some custom error message"}
//BUT HOW TO CATCH THIS AND POSSIBLY REMOVE THE MODEL FROM THE STORE
});
解决这个问题的一种方法是进行额外的ajax调用,检查名称是否唯一,然后进行保存。我只是想知道这里最好的/优雅的方法是什么
谢谢,
迪伊
编辑:我认为在groovy的服务器端提供更多的上下文可能会有所帮助。这就是:
在我的控制器中,我有:
def create() {
try {
newRow = someService.create(params)
render someService.list(newRow) as JSON//returns data in format needed by ember-data
}
catch (ValidationException ex) {
def errors = ["errors":[]]
ex.errors.allErrors.each{
if(it.arguments[0] == "fieldName" && it.code=="constrantViolated"){
errors.errors.push(["field":it.arguments[0],"message":"some custom message"])
}
}
//I am using 422 here because of post in http://stackoverflow.com/questions/7996569/can-we-create-custom-http-status-codes
render(status: 422, contentType: 'JSON', text: (errors as JSON))
}
}
然后在我的余烬控制器中:
var myModel = self.get('store').createRecord('myModel ', myModelDataInJSON);
myModel .save().then(function () {
//if success
},
function (response) {
myModel .deleteRecord();
var errors = $.parseJSON(response.responseText);
for (var key in errors.errors) {
//do something
}
});
deleteRecord
将删除该记录
myModel.save().then(function(response) {
//if success
//server responded with {"myModel:{"id":1,"name":"someName","value":"someValue"}"}
},function(response) {
//if failure
//server responded with {"error":"some custom error message"}
//BUT HOW TO CATCH THIS AND POSSIBLY REMOVE THE MODEL FROM THE STORE
if(response.error=='no good'){
myModel.deleteRecord();
}
});
您可以通过向模型中添加属性来处理模型中的错误:
becameError: ->
# handle error case here
alert 'there was an error!'
becameInvalid: (errors) ->
# record was invalid
alert "Record was invalid because: #{errors}"
检查:为什么答案不是只使用:DS.ERRORS类 从EmberJS文档: 例如,如果您的用户模型如下所示:
App.User=DS.Model.extend({
用户名:attr('string'),
电子邮件:attr('string')
});代码>
您试图保存一条未在后端验证的记录
var user = store.createRecord('user', {
username: 'tomster',
email: 'invalidEmail'
});
user.save();
您的后端数据存储可能返回如下所示的响应。此响应将用于填充错误对象
{
"errors": {
"username": ["This username is already taken!"],
"email": ["Doesn't look like a valid email."]
}
}
通过访问用户的属性名称或使用messages属性获取所有错误的数组,可以向用户显示错误
{{#each errors.messages}}
<div class="error">
{{message}}
</div>
{{/each}}
{{#each errors.messages}
{{message}}
{{/每个}}
这个问题只关注模型的验证吗?与持久化/保存相比,数据在进入数据存储之前就已经是干净的了。。。看起来您仍然需要在适配器数据存储级别进行错误管理
总而言之,为什么不在UI控制级别使用模板或基于普通的JS验证呢?谢谢。起初我对如何获取response.error有问题,但后来我发现如何使用正确的HTTP错误代码发送响应文本,并获取responseText。目前我也是这样做的,但我不喜欢它开始显示记录,并在服务器应答后将其删除。有没有一种方法可以等待服务器的答案显示持久记录?出现这个问题是因为我不知道如何获取保存问题时可能弹出的服务器端错误。是的,我们会在保存模型之前验证模型,但有时服务器可能会关闭,或者存在某些只能在服务器级别进行的验证(如检查唯一性等),我们只是想在UI中显示这些错误。我目前正在做一件与您建议的非常类似的事情,这样所有服务器端错误和客户端错误都会被推送到同一个数组中,并且不需要在UI中进行太多更改来显示错误。谢谢。我明白了。。。服务器端的体系结构是什么?它是一个RubyonRails环境,具有最终存储所有数据的基于sql类型的数据库吗?或者更简单的东西-Rest-->Firebase?以上文字来源于此,仅供参考