如何在Ember-Data 1.0.0中处理服务器端验证

时间:2013-12-05 11:50:03

标签: validation ember.js ember-data

我正在使用Ember 1.2.0和最新的Ember Data Beta,并且想知道如何处理服务器端错误(来自API调用)。

This question非常相似,但不起作用。

首先,becameInvalid方法未触发。我正在使用ember-validations(我必须这么做吗?)

我的API发送了422状态代码并且响应如下:

{"errors":{"name":["has already been taken"],"initial":["has already been taken"]}}

model.js

Docket.Customer = DS.Model.extend( Ember.Validations, {
  name:        DS.attr('string'),
  initial:     DS.attr('string'),
  description: DS.attr('string'),
  validations: {
    name: {
      presence: true
    }
  },
  becameError: function() {
    alert('there was an error!');
  },
  becameInvalid: function(errors) {
    alert("Record was invalid because: " + errors);
  }
});

controller.js

Docket.OrganizationCustomersController = Ember.ArrayController.extend({

  actions: {

    save: function () {
      var customer = this.store.createRecord('customer');
      customer.set('name', this.get('name'));
      customer.set('initial', this.get('initial'));
      customer.set('description', this.get('description'));

      customer.save().then(function() {
        console.log('jeah')
      }, function() {
        console.log('nooo')
      });

    }

  }

});

becameError方法被触发,但becameInvalid方法没有。

第二个问题:即使触发了错误,Ember.js也会将新记录添加到DOM中。我该如何防止这种行为?

2 个答案:

答案 0 :(得分:1)

您的错误json没问题,我认为您使用的是DS.RESTAdapter,并且它没有实现基于json的becameInvalid错误。

目前只有DS.ActiveModelAdapter已实施,因此我建议您将适配器配置更改为:

Docket.ApplicationAdapter = DS.ActiveModelAdapter;

答案 1 :(得分:0)

为了保留DS.RestAdapter,您可以使用ActiveModelAdapter中的方法覆盖其ajaxError方法。

至于今天,由于需要一些依赖性而略微适应的代码将是:

App.ApplicationAdapter = DS.RESTAdapter.extend({
    // ... your own customizations,
    ajaxError: function(jqXHR) {
        var error = this._super(jqXHR);

        if (jqXHR && jqXHR.status === 422) {
            var response = Ember.$.parseJSON(jqXHR.responseText),
                errors = {};

            if (response.errors !== undefined) {
                var jsonErrors = response.errors;

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

            return new DS.InvalidError(errors);
        } else {
            return error;
        }
    }
});

显然,您有机会适应您的后端细节:HTTP代码(422不是标准代码)和格式。

资料来源: http://discuss.emberjs.com/t/how-to-handle-failure-to-save-on-server/3789