すべてのAjax.Request onSuccessイベントを拡張する(Javascript Prototype Framework)

ajax javascript prototypejs
すべてのAjax.Request onSuccessイベントを拡張する(Javascript Prototype Framework)

私は多くの場所で Ajax.Request`とその onSuccess`イベントハンドラを使うアプリケーションを持っています。

これらすべての onSuccess`イベントが発生する前に私は(応答をチェックする)関数を呼び出す必要があります。 `onComplete`イベントで Ajax.Responders.register`を使ってみましたが、 Ajax.Request`の onSuccess`イベントの後に発生します。 助言がありますか?

  0  3


ベストアンサー

Aleksander Krzywinskiの答えに似ていますが、これをonCreate Responderに統合することで、どこにでも “wrap”の使用を振りかける必要がなくなると思います。

Ajax.Responders.register({

onCreate:function(request){

request.options ['onSuccess'] = request.options ['onSuccess']。wrap(validateResponse);

}

;));

4


http://www.prototypejs.org/api/ajax/request [から選択するイベント]がいくつかあります。 これは `Ajax.Request`のイベントチェーンです。

  1. onCreate

  2. onUninitialized

  3. onLoading

  4. onLoaded

  5. onInteractive

  6. onXYZ、` onSuccess`、または onFailure

  7. onComplete

onLoading、` onLoaded`、 `onInteractive`は面白いように思えますが、http://www.prototypejs.org/api/ajax/options [仕様]によると、それらが起こることは保証されていません。 これは `onCreate`にフックする可能性をあなたに残します。それはリクエストオブジェクトが構築された直後、しかしリクエストが実際になされる前に呼ばれます。

3


onSuccessの他のコードの前に自分のメソッドを実行し、何か問題がある場合はfalseを返すことができます。

1


これは少し遅れるかもしれません、しかし同じ問題について疑問に思う誰かの利益のために私はこの解決策を提案します:

これを行うには、プロトタイプ独自のアスペクト指向プログラミングの実装を使用できます。 もちろん、すべてのonSuccessパラメータを変更する必要がありますが、すべてのコールバック関数を更新するのではなく、単純な検索と置換で行うことができます。 これがAjax.Requestの作成例です。

new Ajax.Request( 'example.html'、{parameters:{action: 'update'}、onSuccess:this.updateSuccessful});

あなたのコード全体に似たようなコードスニペットがあり、実際の関数が実行される前に応答を検証する(あるいはまったく実行されないようにさえされる)特定の関数をそれらすべての前に置きたいとします。 Prototypeで提供されているFuntion.wrapを使用することで、上記のコードを拡張することでこれを実行できます。

new Ajax.Request( 'example.html'、{parameters:{action: 'update'}、onSuccess:this.updateSuccessful.wrap(validateResponse)});

「validateResponse」がこれと同じような機能であるところ:

// If you use the X-JSON-header of the response for JSON, add the third param
function validateResponse(originalFn、transport / *、json * /){//トランスポートを検証する

if(someConditionMet){originalFn(transport / *、json * /); }}

したがって、onSuccessをすばやく検索して ‘wrap(validateResponse)’に貼り付けるだけで、onSuccess関数を一箇所に拡張できます。 これはまた、特定のAjaxリクエストのニーズに応じていくつかのラッパー関数を使用するという選択肢も提供します。

1


これが最もきれいな解決策であるかどうか知りません、しかし私にとってそれはトリックをしました。

var tmp = Ajax.Request; Ajax.Request = function(url、args){//リクエストが送信される前にすべきことvar c = Object.clone(args); c.onSuccess = function(transport){//リクエストが成功したとき、コールバックの前にやるべきことargs.onSuccess(transport); }

var a = new tmp(url、c);を返します。 Ajax.Request.protoype = new tmp(); Ajax.Request.Events = tmp.Events; tmpを削除します。

1


“一般的な解決策” – JSフレームワークに依存しない(種類)

var oldFunc = Ajax.Request.onSuccess; Ajax.Request.onSuccess = function foo(){alert( 't'); oldFunc.apply(これ、引数)。 }

これは、実行前に毎回警告ボックスを表示することを除いて、それがしたことを正確に実行するようにJS関数を「拡張」します。

0


タイトルとURLをコピーしました