这个周末我试图弄清楚同样的事情。根据 Luke 所说的,我仔细查看了最新提交(12 月 11 日)的 ember-data 源。
TLDR;要处理 ember-data 更新/创建错误,只需在您的实例上定义becameError()
和。RESTadapter 的 AJAX 错误回调触发的级联最终会调用你定义的这些函数。becameInvalid(errors)
DS.Model
例子:
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}"
以下是源代码的完整介绍:
在 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);
}
});
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);
}
},
反过来,store.recordWasInvalid
并且store.recordWasError
(在此处定义)调用记录(DS.Model)的处理程序。在无效的情况下,它会将来自适配器的错误消息作为参数传递。
recordWasInvalid: function(record, errors) {
record.adapterDidInvalidate(errors);
},
recordWasError: function(record) {
record.adapterDidError();
},
DS.Model.adapterDidInvalidate
和adapterDidError
(在这里定义)简单地send('becameInvalid', errors)
或者send('becameError')
最终将我们带到这里的处理程序:
didLoad: Ember.K,
didUpdate: Ember.K,
didCreate: Ember.K,
didDelete: Ember.K,
becameInvalid: Ember.K,
becameError: Ember.K,
(Ember.K 只是一个用于返回的虚拟函数this
。见这里)
因此,结论是,您只需为模型定义函数becameInvalid
并becameError
在模型上定义函数来处理这些情况。
希望这对其他人有所帮助;文档现在当然没有反映这一点。