2012-12-20 39 views
1

如何添加服務器端所有ajax響應中發送的內容,以便我可以添加自己的參數?A4J AJAX處理程序參數設置從服務器端Java

我已經延長RichFaces的JavaScript的A4J.AJAX.finishRequest觸發一個自定義事件,我想參數從服務器傳遞給它:

var originalFinishRequest = A4J.AJAX.finishRequest; 

A4J.AJAX.finishRequest = function(request) { 
    var parameters = request.options.parameters; 
    if (!request._oncomplete_aborted) { 

     jQuery(document).trigger('onAutofocus',parameters); 
    } 
    originalFinishRequest(request); 
}; 

的看着這將是另一種方式,有什麼迴應服務器端調用A4J.AJAX.Submit,我怎麼包裝我自己的代碼呢?


我的解決方案

這是我最後決定將在我的主模板,基於BalusC的回答是:

<a4j:outputPanel ajaxRendered="true"> 
    <c:if test="#{not empty flowScope.autofocusSelectors}"> 
    <script> 
     document.autofocusSelectors = #{flowScope.autofocusSelectors}; 
     console.log("BASE TEMPLATE: autofocus: (#{flowScope.autofocusSelectors})"); 
    </script> 
    </c:if> 
    <script> 
    console.log("BASE TEMPLATE AJAX RENDER") 
    //NB: autofocusSelectors not always set, and not only reason to autofocus 
    jQuery(document).trigger('onAutofocus'); 
    </script> 
</a4j:outputPanel> 

回答

0

雖然這很容易在JSF2已經標準化了oneother,這在RichFaces 3.x Ajax4jsf中並不是微不足道的。 Ajax響應由org.ajax4jsf.Filter處理,而org.ajax4jsf.Filter繼而從BaseXmlFilter延伸。所有的Ajax響應編寫代碼都在那裏。它不是以這種方式抽象出來的,它可以輕鬆添加自定義標籤/腳本。你基本上需要copy'n'paste'n'modify它。這只是不值得的努力。

一個簡單的方法是自動ajax渲染一些包含JS flavor中所需變量的<script>,以便可以將bean屬性指定爲全局JS變量。

<a4j:outputPanel ajaxRendered="true"> 
    <script type="text/javascript"> 
     var parameters = <h:outputText value="#{bean.paramsAsJson}" />; 
    </script> 
</a4j:outputPanel> 

(該ajaxRendered="true"保證,這是自動重新呈現在每一個Ajax請求,這樣就不需要它的ID明確地添加到reRender屬性一些A4J組件)

在哪裏getParamsAsJson()只是以有效的JSON格式返回Java字符串,類似{ foo: "foo", bar: "bar" }。這樣,你可以只使用

A4J.AJAX.finishRequest = function(request) { 
    if (!request._oncomplete_aborted) { 
     jQuery(document).trigger('onAutofocus', parameters); 
    } 
    originalFinishRequest(request); 
}; 

(注意:request.options.parameters基本上包含由客戶端在焙燒Ajax請求,而不是它們由服務器端設置的變量在返回Ajax響應發送的請求參數,所以它是在第一個地方已經錯看它)

而且,我不知道是什麼原因,你要覆蓋A4J.AJAX.finishRequest像,而不是使用<a4j:status onstop="...">,但假設你只是不知道它,這是你可以如何使用它:

<a4j:status onstop="jQuery(document).trigger('onAutofocus', parameters)" /> 
+0

我試圖用額外的服務器端參數來擴展'request.options.parameters',因爲看起來比拾取全局JS變量更加整潔,因爲我不想在任何地方插入腳本。我不知道ajaxRendered技術,但如果我能夠在我的基本模板中使用它,它看起來像一個很好的解決方案。 –

+0

'request.options.parameters'表示在發送ajax請求之前已經填充的HTTP請求參數映射。這絕對不是服務器端可變的。 – BalusC

+0

我知道'a4j:status onstop',但它已經用於其他事物的代碼中,我相信它只能被定義一次。我也想避免在每個頁面上添加標籤。 –