在保存模型时,是否可能在Ember Data中处理自定义的服务器端错误?

5 浏览
0 Comments

在保存模型时,是否可能在Ember Data中处理自定义的服务器端错误?

在保存模型时,有没有正确的方法来处理自定义错误?举个例子,假设我有一个只有两个属性“name”和“value”的模型。当我执行以下操作时:

var myModel = this.get('store').createRecord('myModel', {"name": "someName", "value": "someValue"});
myModel.save().then(function() {
    //如果成功
    //服务器返回 {"myModel:{"id":1,"name":"someName","value":"someValue"}"}
},function() {
    //如果失败
    //服务器返回 {"error":"some custom error message"}
    //但是如何捕捉这个错误并且可能从存储中删除模型?
});

一种解决方法是进行额外的ajax调用来检查名称是否唯一,然后再保存。我只是想知道这里最好/最优雅的方法是什么。

谢谢,

Dee

编辑:我想给服务器端的事情提供更多的背景信息可能会有所帮助。所以在这里是:

在我的控制器中我有:

def create() {
    try {
        newRow = someService.create(params)
        render someService.list(newRow) as JSON//以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"])
            }
        }
        //我在这里使用422,因为在http://stackoverflow.com/questions/7996569/can-we-create-custom-http-status-codes中进行了发布
        render(status: 422, contentType: 'JSON', text: (errors as JSON))
    }
}

然后在我的ember控制器中:

var myModel = self.get('store').createRecord('myModel ', myModelDataInJSON);
myModel .save().then(function () {
        //如果成功
    },
    function (response) {
        myModel .deleteRecord();
        var errors = $.parseJSON(response.responseText);
        for (var key in errors.errors) {
            //do something
        }
    });

0
0 Comments

在使用deleteRecord删除记录的时候,如果保存模型失败,服务器会返回一个自定义的错误消息。但是如何捕获这个错误并可能从存储中删除模型呢?

目前,我是通过发送带有正确HTTP错误代码和响应文本的请求来实现的。但是我不喜欢在服务器回答之后开始显示记录并将其删除。有没有一种方法可以等待服务器回答后再显示持久化的记录呢?

0
0 Comments

问题的原因是,当保存模型时,可能会出现服务器端的错误,但是在Ember Data中如何处理这些错误。解决方法是使用DS.ERRORS类来处理这些错误。根据EmberJS文档的例子,如果有一个User模型,其中包含username和email两个属性,当尝试保存一个在后端验证失败的记录时,后端数据存储可能会返回一个包含错误信息的响应。可以通过访问属性名或使用messages属性来显示错误信息。问题的焦点是如何在保存模型时获取服务器端的错误,并将这些错误显示在用户界面上。这对于在服务器端进行特定验证(如唯一性检查等)或服务器端出现错误时很有用。作者目前正在实现一个类似的解决方案,将所有服务器端和客户端的错误都推送到同一个数组中,并且在用户界面上显示错误时不需要做太多修改。

0
0 Comments

问题的出现的原因:

在使用Ember.js Data RESTAdapter时,当保存模型时,无法处理自定义的服务器端错误。

解决方法:

可以通过在模型中添加属性来处理错误:

becameError: ->
  # 处理错误情况
  alert 'there was an error!'
becameInvalid: (errors) ->
  # 记录无效
  alert "Record was invalid because: #{errors}"

参考链接:[How should errors be handled when using the Ember.js Data RESTAdapter?](https://stackoverflow.com/questions/12968829)

0