FacesMessages and rich: эффект? - PullRequest
1 голос
/ 04 мая 2010

Я хотел бы иметь возможность совершать Ajax-вызов с использованием JSF / Seam / RichFaces и обновлять страницу соответствующим компонентом h: messages. Это работает без проблем. Я могу выполнить соответствующий рендер. Однако я также хотел бы иметь возможность использовать rich: effect, чтобы сделать его немного красивее. В идеале я хотел бы, чтобы сообщения исчезали, а затем исчезали, когда пользователь нажимал на них. Однако до сих пор я не мог заставить это работать.

Кто-нибудь получил такой сценарий работы? Кто-нибудь, кто знает JSF / Seam немного лучше меня, имеет какой-нибудь хороший совет? Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 04 мая 2010

Я делаю именно это, хотя я не беспокоюсь о rich:effect.

Я использую jQuery. Это личное предпочтение, но я нахожу его намного проще и прямее, чем использование rich: effect (основанного на Scriptaculous). Стоит взглянуть на документацию jQuery Effects .

Пример:

Добавьте jquery на свою страницу (поставляется с richfaces):

<a:loadScript src="resource://jquery.js"/>

Для удобства назначьте jQuery $ j (добавьте это в свой javascript):

$j = jQuery.noConflict();

Сообщения Div:

<a:outputPanel id="messagetextPanel" ajaxRendered="true" layout="block" style="z-index:100; display:none;">
    <s:div styleClass="messagetext" rendered="#{not empty facesContext.maximumSeverity}">
        <h:messages infoClass="infomessage" errorClass="errormessage" warnClass="warningmessage" layout="list" />
        <s:div styleClass="messageClose">
            <a onclick="hideMessages();">#{messages['messages.close']}</a>
        </s:div>
    </s:div>
</a:outputPanel>

Некоторые JavaScript, чтобы скрыть и показать div:

function hideMessages() {
  $j("div#messagetextPanel").fadeOut("slow");
}
function showMessages() {
  $j("div#messagetextPanel").fadeIn("fast");
}

Теперь вам просто нужно найти лучший способ вызова showMessages () при завершении вызова (например, использовать oncomplete на вашем a4j:commandButton и т. Д.).

Лично я предпочитаю не влиять на отображение div, чтобы я мог использовать ajaxRendered для обработки всего. Вы можете сделать это, заменив первую строку на:

<a:outputPanel id="messagetextPanel" ajaxRendered="true" layout="block" style="z-index:100; display: #{empty facesContext.maximumSeverity ? 'none' : 'block'};">

Таким образом, мне не нужно иметь никакого кода на моей кнопке / ссылке / поддержке, и сообщения FacesMessages всегда будут отображаться, когда мой внутренний код решит создать его.

0 голосов
/ 28 мая 2010

Спасибо за ваше предложение, Дамо. Я попробовал, и это сработало без проблем. Кроме того, мне удалось решить это с помощью rich: effect. Вот что я придумал:

            <a:outputPanel id="message-panel"
            onclick="hideMessages({delay:0.5,duration:0.9});">
                <h:messages id="messages" globalOnly="true" styleClass="message"
                    errorClass="errormsg" infoClass="infomsg" warnClass="warnmsg"
                    rendered="#{showGlobalMessages != 'false'}" />
            </a:outputPanel>
                <rich:effect name="hideMessages" for="message-panel" type="Fade" />

...

            <h:form>
                <a:commandLink action="#{myAction.runTest()}" value="Run Test"
                    reRender="message-panel" />
            </h:form>

Как только я это сделал, все заработало как положено.

...