この質問は Backbone 0.9.2 に関するものでした
Backbone 0.9.10 にアップグレードしてから、代わりに Backbone.sync をオーバーライドすることを選択しましたが、これは魅力的に機能します。
- 2012 年 12 月- (v0.9.9) Backbone.wrapError が削除されました。
- 2013 年 2 月- 次のバージョンの Backbone で WrapError が復活するようですが、backbone.sync をオーバーライドするのが最善策です。
(長々と読んですみません)
私は Backbone.wrapError 関数を変更していますが、行に困惑しています。行が何をするかは知っていますが、なぜそれが必要なのかはわかりません。
resp = model === originalModel ? resp : model;
- resp は最終的に textStatus/errorType になります。つまり、「エラー」「タイムアウト」「解析エラー」です。
- モデルは XHR リクエスト オブジェクトです
- originalModel は、最終的にこの関数を呼び出した Backbone.Model インスタンスへの参照です。
Backbone.wrapError の機能、戻り値、使用方法についてはよく理解していますが、上記の行の目的を理解できないようです。
Backbone のドキュメントには、wrapError は「オプションのエラー コールバックをフォールバック エラー イベントでラップする」と記載されていますが、これは事実です。さらに、Backbone.wrapError はライブラリで fetch、save、destroy、および reset 関数内から 4 回呼び出され、AJAX エラーがライブラリによって見過ごされないようにすることを学びました。たとえば、AJAX エラー コールバックが fetch メソッドに渡された場合、いくつかのパラメーターが渡されて実行されます。そうでない場合、モデルは同じいくつかのパラメーターが渡されたエラー イベントをトリガーします。
呼び出しの例:
options.error = Backbone.wrapError(options.error, model, options);
Backbone.wrapError:
Backbone.wrapError = function(onError, originalModel, options) {
return function(model, resp) {
resp = model === originalModel ? resp : model;
if (onError) {
onError(originalModel, resp, options);
} else {
originalModel.trigger('error', originalModel, resp, options);
}
};
};
この行 ( resp = model === originalModel ? resp : model;
) で発生する問題は、model と resp が jQuery/Zepto エラー コールバック パラメータ リスト内の最初の 2 つのパラメータに対応することです。最初の問題は、これらのパラメーター (モデル、応答) の命名に関するものです。デバッグ中に、これらの 2 つのパラメーターがjqXHR/xhr
とであることがわかったためtextStatus/errorType
です。textStatus/errorType パラメーターは通常「エラー」になりますが、(ドキュメントによると)「タイムアウト」「解析エラー」などになることもあります。比較はmodel === originalModel
意味がありません。XHR オブジェクトと Backbone.Model インスタンスの厳密な比較は常に失敗し、(resp) にmodel
格納されます。response
model
は実際には XHR 応答オブジェクトです...この行は私には無意味に思えますが、先に進んで変更した wrapError メソッドに含めました。
model === originalModel
常に false と評価されるため、行は resp = model; の精巧なバージョンのように見えます。行を完全に削除するだけで、model
パラメーターをoriginalModel.trigger('error', originalModel, resp, options);
の代わりに渡すことができるため、これは役に立ちませんresp
。
model === originalModel
true と評価される可能性のあるインスタンスはありますか?
Backbone.js、AJAX の経験が豊富な人は、この行が必要な理由について回答/説明を持っていますか?