2012-01-19 129 views
3

我想要一箇中心位置來監視ajax請求,並在某些情況下中止它們。從jsf.ajax.addOnEvent()中止JSF Ajax請求()

我不知道要做的唯一事情是從一箇中央功能實際中止ajax請求。

我想象的解決方案將是這個樣子:

jsf.ajax.addOnEvent(function(data) { 
    if (data.status === 'begin') { 
     // abort the ajax request 
    } 
}); 

不過,我可能是錯誤的。

謝謝!

回答

3

這是標準JSF JS API不可能的。最好的辦法是在調用JSF組件上添加一個onclickonchange處理程序,如果滿足所需條件以中止ajax請求,則返回false

<h:commandButton onclick="return mayFireAjax(this)"> 
    <f:ajax /> 
</h:commandButton> 

如有必要,可以摘要廢除jQuery.on()(或jQuery.delegate()jQuery.live()取決於所使用的jQuery的版本)在一個共同的選擇,這樣你就不需要再重複它在每一個需要的組件。

$(someSelector).on("click", function() { 
    return mayFireAjax(this); 
}); 
1

如果您有控制源,您可以隨時將onClick附加到UICommand組件。但在某些情況下,您無法訪問源代碼。例如,ajax由某個第三方組件提供。你不想搞亂他們的組件。

首先,我有一個小型的js庫。

var FxJSFBegin = "JSFBegin"; 

if (jsf) { 

    var originalRequest = jsf.ajax.request; 

    jsf.ajax.request = function(source, oevent, options) { 

     var event = $.Event(FxJSFBegin); 

     event.options = options; 

     event.originalEvent = oevent; 

     $(source).trigger(event); 

     if (event.isDefaultPrevented()) { 

      return; 

     } else { 

      originalRequest.apply(null, arguments); 

     } 

    }; 

} 

此代碼代理原始JSF ajax調用。它使用jQuery來觸發「JSFBegin」事件。集成代碼可以使用jQuery機制來監聽此事件。監聽器可以使用event.preventDefault()取消jsf調用。

要求:

  1. jQuery的
  2. 這塊代碼應放置jsf.js之後被加載。