2012-12-20 3 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, который унифицировал one и other, это не совсем тривиально в RichFaces 3.x Ajax4jsf. Ответы Ajax обрабатываются org.ajax4jsf.Filter, который, в свою очередь, простирается от других BaseXmlFilter. Все код написания ответа ajax находится там. Это не абстрагируется таким образом, что позволяет легко добавлять пользовательские теги/скрипты. Вам в принципе нужно копировать «не пытайтесь» изменить его. Это просто не стоит усилий.

Простым способом является просто автоматическое ajax-рендеринг некоторого фрагмента <script>, содержащего требуемые переменные в JS-ароматизаторе, чтобы свойства bean-компонента могли быть назначены как глобальная переменная JS.

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

(ajaxRendered="true" гарантирует, что это автоматически rerendered на каждом АЯКС запросе, так что вам не нужно явно добавить его идентификатор в атрибут reRender некоторого a4j компонента)

Где getParamsAsJson() просто возвращает строку Java в действительном формате JSON примерно как { foo: "foo", bar: "bar" }. Таким образом, вы можете просто использовать

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

(обратите внимание, что request.options.parameters в основном содержит параметры запроса, которые посылаются клиентом при обжиге запрос 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' представляет собой карту параметров запроса HTTP, которая уже заполнена перед отправкой запроса ajax. Это определенно не изменяет со стороны сервера. – BalusC

+0

Мне было известно о 'a4j: status onstop', но он уже используется в коде для других вещей, и я считаю, что он может быть определен только один раз.Я также хочу, чтобы не добавлять теги на каждую страницу. –