使用Ember.js Data RESTAdapter时应该如何处理错误?

mic*_*ien 42 ember.js ember-data

ember-data.js:https://github.com/emberjs/data/tree/0396411e39df96c8506de3182c81414c1d0eb981

简而言之,当出现错误时,我想在视图中显示错误消息,然后用户可以1)取消,这将回滚事务2)纠正输入错误并成功提交事务,传递验证服务器.

以下是来自源代码的代码段.它不包含错误回调.

updateRecord: function(store, type, record) {
  var id = get(record, 'id');
  var root = this.rootForType(type);

  var data = {};
  data[root] = this.toJSON(record);

  this.ajax(this.buildURL(root, id), "PUT", {
    data: data,
    context: this,
    success: function(json) {
      this.didUpdateRecord(store, type, record, json);
    }
  });
},
Run Code Online (Sandbox Code Playgroud)

总的来说,从服务器接收错误和更新视图的流程是什么?似乎错误回调应该将模型置于一个isError状态,然后视图可以显示相应的消息.此外,交易应该保持脏.这样,交易就可以使用了rollback.

不过,似乎使用store.recordWasInvalid正朝着正确的方向发展.

She*_* Yu 42

本周末我试图想出同样的事情.关闭卢克所说的内容,我仔细研究了最新提交的余烬数据源(12月11日).

TLDR; 处理烬数据更新/创建错误,简单地定义becameError()becameInvalid(errors)你的DS.Model实例.由RESTadapter的AJAX错误回调触发的级联最终将调用您定义的这些函数.

例:

App.Post = DS.Model.extend
  title: DS.attr "string"
  body: DS.attr "string"

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

  becameInvalid: (errors) ->
    # record was invalid
    alert "Record was invalid because: #{errors}"
Run Code Online (Sandbox Code Playgroud)

以下是完整的资料来源:

在REST适配器中,这里给出了AJAX回调错误函数:

   this.ajax(this.buildURL(root, id), "PUT", {
      data: data,
      context: this,
      success: function(json) {
        Ember.run(this, function(){
          this.didUpdateRecord(store, type, record, json);
        });
      },
      error: function(xhr) {
        this.didError(store, type, record, xhr);
      }
    });
Run Code Online (Sandbox Code Playgroud)

didError 在这里定义,它依次调用商店的recordWasInvalid或recordWasError,具体取决于响应:

  didError: function(store, type, record, xhr) {
    if (xhr.status === 422) {
      var data = JSON.parse(xhr.responseText);
      store.recordWasInvalid(record, data['errors']);
    } else {
      store.recordWasError(record);
    }
  },
Run Code Online (Sandbox Code Playgroud)

反过来,store.recordWasInvalidstore.recordWasError(在这里定义)调用记录(DS.Model)的处理程序.在无效的情况下,它将来自适配器的错误消息作为参数传递.

 recordWasInvalid: function(record, errors) {
    record.adapterDidInvalidate(errors);
  },

  recordWasError: function(record) {
    record.adapterDidError();
  },
Run Code Online (Sandbox Code Playgroud)

DS.Model.adapterDidInvalidateadapterDidError(在这里定义)简单send('becameInvalid', errors)send('becameError')最终引导我们到这里的处理程序:

  didLoad: Ember.K,
  didUpdate: Ember.K,
  didCreate: Ember.K,
  didDelete: Ember.K,
  becameInvalid: Ember.K,
  becameError: Ember.K,
Run Code Online (Sandbox Code Playgroud)

(Ember.K只是一个返回的虚拟函数this.见这里)

因此,得出的结论是,你只需要定义的功能becameInvalid,并becameError在模型处理这些情况.

希望这有助于其他人; 文档当然没有反映这一点.

  • 如果要根据上下文不同地处理错误,也可以在提交事务之前添加`model.one('becomeInvalid',function(){// error handling here})`来进行一次性回调. (2认同)

Luk*_*lia 8

DS.RESTAdapter只是在这个提交中有更多的错误处理,但是我们还没有达到我们对错误处理有很好建议的程度.

如果你雄心勃勃/疯狂到今天使用ember-data将应用程序投入生产(就像我一直这样!),最好确保你的API失败的可能性非常低.即验证您的数据客户端.

希望我们能在未来几个月内以更好的答案更新这个问题.