В настоящее время мы разрабатываем интернет-магазин B2B на основе Java EE 5, JSF, Facelets и RichFaces. До сих пор технология действительно работала очень хорошо, но теперь я столкнулся с небольшой проблемой, которую просто не могу понять, как решить:
Товары представлены в виде таблиц, где каждый товар можно добавить в корзину, нажав на маленькую иконку в конце строки. Добавление товара осуществляется через AJAX, чтобы избежать полной перезагрузки страницы. Это работает без каких-либо проблем, просто используя h:dataTable
и a4j:commandLink
для вызова метода действия, который добавляет выбранный продукт в корзину. Даже повторный рендеринг суммы корзины, всегда видимой на боковой панели, работает правильно.
Из-за особенностей AJAX нет никаких видимых указаний (кроме меняющейся суммы сбоку) на то, что операция прошла успешно или по крайней мере была завершена. Теперь я хочу добавить небольшое «всплывающее» окно, которое становится видимым рядом со значком добавления после завершения AJAX-операции, сообщая, что элемент был добавлен в корзину. Это поле должно автоматически исчезнуть через несколько секунд.
Это то, что я думаю, должно работать (css-классы popup_message и popup_content заставляют поле плавать над положением, в котором находится его разметка):
<h:dataTable ....>
...
<h:column>
<a4j:commandLink action="...">
<rich:effect event="oncomplete" targetId="addedMessage"
type="Appear" />
<rich:effect event="oncomplete" targetId="addedMessage"
type="Appear" params="{delay:3.0, duration:1.0}" />
</a4j:commandLink>
<a4j:outputPanel id="addedMessage" styleClass="popup_message"
style="display: none">
<a4j:outputPanel layout="block" styleClass="popup_content">
<h:outputText value="Item added!" />
</a4j:outputPanel>
</a4j:outputPanel>
</h:column>
</h:dataTable>
К сожалению, он вообще не отображает коробку. Если я изменю event
эффекта «Появление» на onclick
, он будет работать почти так, как ожидалось. Он сразу же отображается при нажатии на значок и исчезает через 3 секунды после завершения операции AJAX. Но я не хочу, чтобы она появлялась сразу после клика, потому что было бы неправильно указывать, что товар добавлен в корзину, когда на самом деле операция еще даже не началась. Это становится еще более важным, когда я хочу указать на какую-то ошибку или хочу включить в поле некоторую информацию, относящуюся к элементу, которая доступна только после добавления элемента.
Итак, есть идеи, как это сделать? А почему добавление двух эффектов на одно и то же событие не работает?
(Я уже просмотрел пример эффекта из живой демонстрации RichFaces. Примеры работают почти так же, за исключением того, что они добавляют второй эффект с явным указанием атрибута for
. Но даже это не работает для меня.)
Обновление: я пытался использовать для этой цели rich:toolTip
, который на самом деле кажется довольно гибким. Но независимо от того, что я делаю, я не могу ничего прикрепить к событию "oncomplete" (я также пробовал просто "complete") события a4j:commandLink
, кроме одного эффекта... кажется, что есть какая-то ошибка/недокументированное поведение в отношении этого событие. Я только что нашел этот отчет об ошибке: RF-3427