2008-11-13 51 views
0

我有一個使用Ajax.Request並在很多地方它onSuccess事件處理程序的應用程序。擴展每個Ajax.Request的事件的onSuccess(使用Javascript原型框架)

我需要之前所有這些onSuccess事件觸發調用一個函數(將檢查響應)。我嘗試使用Ajax.Responders.registeronComplete事件,但它Ajax.RequestonSuccess事件後觸發。有什麼建議麼?

+0

您正在使用哪種語言? – Ady 2008-11-13 09:21:01

+0

嗨,Ady,我使用JavaScript原型框架 – matte 2008-11-13 09:22:31

回答

1

這可能是有點晚,但對於其他人想知道同樣問題的利益,我會提出此解決方案:

您可以使用自己的原型是否履行面向方面編程的離子來做到這一點。當然,您將不得不修改所有onSuccess參數,但可以通過簡單的搜索和替換來完成,而不是更新所有的回調函數。下面是一個例子的Ajax.Request創建:

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

說你也有類似的代碼段遍佈你的代碼,你要preceed他們都具有一定的功能,運行的實際功能之前驗證響應(甚至根本不能運行)。通過使用Funtion。包裹在原型提供我們可以通過擴展上面的代碼做到這一點:

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 */) { 
    // Validate the transport 

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

因此你在一箇中央擴大您的onSuccess函數只需快速搜索onSuccess並粘貼'wrap(validateResponse)'即可。這也使您可以根據特定的Ajax請求的需要選擇幾個包裝函數。

1

您可以的onSuccess其他代碼之前運行方法並返回false如果事情是錯誤的。

+0

是的你是對的,但我有很多onsuccess事件已經註冊到處。我想要做的只是擴展基於成功事件。 – matte 2008-11-13 09:24:40

3

有幾個events to chose from。下面是Ajax.Request事件鏈:

  1. onCreate
  2. onUninitialized
  3. onLoading
  4. onLoaded
  5. onInteractive
  6. onXYZonSuccessonFailure
  7. onComplete

onLoadingonLoadedonInteractive聽起來有趣,但根據the spec他們不是一定會發生的。這使得您能夠鉤在onCreate,這被稱爲後立即請求對象是建立的可能性,但該請求實際上之前作出。它曾經是什麼做的,除了每一次顯示一個警告框,獨立於JS框架(種)

var oldFunc = Ajax.Request.onSuccess; 
Ajax.Request.onSuccess = function foo() { 
    alert('t'); 
    oldFunc.apply(this, arguments); 
} 

這將「擴展」您的JS功能使其做正是 -

0

「通解」它執行前...

4

類似於Aleksander Krzywinski的回答,但我相信這會阻止你在任何地方撒上使用「wrap」的東西,把它合併到onCreate Responder。

Ajax.Responders.register({ 

    onCreate: function(request) { 

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

    } 

}); 
1

不知道這是否是最乾淨的解決方案,但對我來說它的確有竅門。


var tmp = Ajax.Request; 
Ajax.Request = function(url, args) { 
// stuff to do before the request is sent 
var c = Object.clone(args); 
c.onSuccess = function(transport){ 
    // stuff to do when request is successful, before the callback 
    args.onSuccess(transport); 
} 

var a = new tmp(url, c); 
return a; 
} 
Ajax.Request.protoype = new tmp(); 
Ajax.Request.Events = tmp.Events; 
delete tmp;