Ember DS.Errors在创建表单上进行故障排除

时间:2015-01-09 19:58:18

标签: ember.js ember-data

我有一个基本的创建表单设置,它在名称字段上进行验证。表单的保存操作承诺优雅地保存错误:

    actions: {
        save: function(){

            var route = this;

            var createCampaign = this.store.createRecord("campaign", {

                code: this.get("code"),
                name: this.get("name"),
                description: this.get("description"),

            });

            this.set("code",""),
            this.set("name",""),
            this.set("description",""),

            // POST values to campaigns

            createCampaign.save().then(function(c){

                route.transitionToRoute("campaigns.view",c.id);

            }, function(errors){


            });
        }
    }

});

我的定义属性是:

    TM.Campaign = DS.Model.extend({
    name: DS.attr(),
    code: DS.attr(),
    description: DS.attr(),

});

我已经读过使用RESTAdapter,ajaxError需要被覆盖,所以我添加了以下内容:

ajaxError: function(jqXHR){

        var error = this._super(jqXHR);

        if(jqXHR && jqXHR.status === 422){

            var response = Ember.$.parseJSON(jqXHR.responseText);

            errors = {}

            if (response.errors){

                var jsonErrors = response.errors;

                Ember.keys(jsonErrors).forEach(function(key){
                    errors[Ember.String.camelize(key)] = jsonErrors[key]
                });

            }

            return new DS.InvalidError(errors)

        } else {

            return error

        }

    }

来自API的响应结构如下:

    {

    "errors": {
        "name": [
            "The name field is required."
        ]
    }

}

但出于某种原因,每当我尝试显示DS.Errors(使用console.log(route.get("errors"))时,我都会得到未定义。就像Ember不知道响应中出现验证错误一样。

我还确保响应状态以422 Unprocessable Entity的形式返回。任何人都能看到我错过的东西吗?

编辑:我已经能够创建一个JS Bin来演示我的问题:http://jsbin.com/xujari/2/

2 个答案:

答案 0 :(得分:0)

你的jsBin略有修改:

http://jsbin.com/luwaqeyoca/1/edit?js,console,output

DS.InvalidError的描述从不说明在路线中设置错误。可靠的部分是它设置了拒绝承诺错误。如果属性具有加载错误键名称的属性,它还会在record自设置一个错误属性(如果您的错误键为name,则必须具有属性name。在你的模型中)

        createCampaign.save().then(function(c){
            route.transitionToRoute("campaigns.view",c.id);
        }, function(errors){
                console.log(errors.errors.name);  //from the promise error 
                console.log(createCampaign.get("errors.name")); //from your record

        });

修改

这是根据您在评论中提到的修改后的bin http://jsbin.com/sokebuzumu/1/edit?html,js,output

您需要在控制器中创建一个空对象“errors”,如jsbin

  createCampaign.save().then(function(c){

        }, function(errors){
            this.set("errors",createCampaign.get("errors"));
        }.bind(this));

答案 1 :(得分:0)

我刚回答了关于Ember数据错误处理here的类似问题,该问题涉及与您的问题相关的错误处理的许多方面。

由于我的PR已合并到Ember Data,因此您不再需要覆盖适配器上的ajaxError处理。错误现在将正确应用于模型,因此您可以根据我之前的答案使用函数来引用错误。