Ember:如何在becomeInvalid状态后检索验证错误?

时间:2013-08-08 17:45:49

标签: ember.js ember-data

我使用RESTadpater来保存数据。当发生验证错误时,我想返回422响应,然后记录错误并在每个不正确的字段旁边显示一个指示。

我的REST响应状态代码如下:

Status Code:422 Unprocessable Entity

我的REST响应正文如下:

{
  "message": "Validation failed",
  "errors": [
    {
      "name": "duplicate"
    }
  ]
}

在我的控制器中,becomeInvalid正确触发。

App.AuthorsNewController = Ember.ObjectController.extend({

  startEditing: function () {
    //Create a new record on a local transaction
    this.transaction = this.get('store').transaction();
    this.set('model', this.transaction.createRecord(App.Author, {}));
  },

  save: function (author) {

    //Local commit - author record goes in Flight state
    author.get('transaction').commit();  

    //If response is success: didCreate fires
    //Transition to edit of the new record 
    author.one('didCreate', this, function () { 
      this.transitionToRoute('author.edit', author);
    });

    //If response is 422 (validation problem at server side): becameError fires
    author.one('becameInvalid', this, function () {
       console.log "Validation problem"
    });
  }

  ...

2问题:

  1. 我想在“console.log”验证问题“'下面记录,这是服务器返回的完整错误列表。我怎样才能做到这一点 ?

  2. 在我的hbs模板中,我想指出相关字段旁边的错误。我怎样才能做到这一点 ?

  3. 我不确定通过REST适配器返回的数据是否正确。所以问题可能出在REST端或Ember端......

2 个答案:

答案 0 :(得分:3)

解决方案:

在控制器保存功能中:

    author.one('becameInvalid', this, function () {
       console.log "Validation problem"
       this.set('errors', this.get('content.errors'));
    });

在hbs模板中:

    {{view Ember.TextField valueBinding='name'}} 
    {{#if errors.name}}{{errors.name}}{{/if}}

答案 1 :(得分:1)

我是这样做的,可能不是最好的做法,但它对我有用:

  1. 而不是使用commit(),我使用save(),如果你想知道区别是什么,here就是链接。我没有尝试过使用事务的方法,但基本上我使用record = App.Model.createRecord(...)创建记录,这里是我在AddShopController中的apiAddShop函数的代码:

    apiAddShop: function() {
    //console.log("add shop");
    newShop = App.Shop.createRecord({name:this.get('name'), currentUserRole:"owner"});
    
    //this.get('store').commit(); // Use record.save() instead, then() is not defined for commit()
    var self = this;
    newShop.save().then(function(response){
        self.transitionToRoute('shops');
    }, function(response){
        // if there is error:
        // server should respond with JSON that has a root "errors"
        // and with status code: 422
        // otherwise the response could not be parsed.
        var errors = response.errors;
        for(var attr in errors){
            if (self.hasOwnProperty(attr)) {
                self.set(attr+"Error", true);
                self.set(attr+"Message", Ember.String.classify(attr)+" "+errors[attr]);
            }
            console.log(attr + ': ' + errors[attr]);
        }
        console.log(response.errors.name[0]);
    });
    

    },

  2. 上面的代码假设表单中的每个属性都有attrError(boolean)和attrMessage(string)。然后在您的模板中,您可以将字段的类绑定到这些错误属性,例如<div {{bindAttr class=":control-group nameError:error:"}}>,并且可以在表单字段旁边轻松显示错误消息,例如:<span {{bindAttr class=":help-inline nameError::hidden"}} id="new_shop_error">{{nameMessage}}</span>这是我的示例车把gist(必须在这里使用gist,因为SO正在逃避我的html输入)。