今週末、私は同じことを理解しようとしていました。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
and (ここで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
これが他の誰かに役立つことを願っています。ドキュメントは確かにこれを反映していません。