6

保存模型时是否有适当的方法来处理自定义错误?举个例子,假设我有一个只有两个属性“name”和“value”的模型。当我这样做时:

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))
    }

}

然后在我的 ember 控制器中:

    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
        }
    });
4

3 回答 3

8

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();
  }

});
于 2013-10-25T04:55:22.733 回答
2

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

becameError: ->
  # handle error case here
  alert 'there was an error!'

becameInvalid: (errors) ->
  # record was invalid
  alert "Record was invalid because: #{errors}"

检查:使用 Ember.js 数据 RESTAdapter 时应该如何处理错误?

于 2013-12-25T13:10:52.477 回答
0

为什么不直接使用:DS.ERRORS CLASS?

来自 EmberJS 文档:

例如,如果您有一个看起来像这样的 User 模型:

App.User = DS.Model.extend({ username: attr('string'), email: 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}}

这个问题是否只关注模型的验证?与持久性/保存它相比,因此数据在到达数据存储之前已经是干净的......似乎您仍然希望在适配器数据存储级别进行错误管理。

说了这么多,为什么不在 UI 控件级别使用模板或基于普通的 JS 验证呢?

于 2014-07-30T16:34:53.720 回答