#jsf #richfaces #ajax4jsf
#jsf #richfaces #ajax4jsf
Вопрос:
У меня проблема с отображением сообщения для DataTable с динамическими столбцами. Я хочу, чтобы сообщение отображалось над datatable, но есть некоторые проблемы с идентификаторами.
<h:form id="formId">
<!-- Here the jsf has to recognize id column_0 but it doesn't-->
<h:message styleClass="validationError" for="column_0" />
<rich:dataTable id="priorityTable" value="#{bean.matrix}" var="priority">
<rich:columns value="#{bean.ordersOrigin}"
var="ordersOrigin"
index="ind">
<f:facet name="header">
<h:outputText value="#{ordersOrigin}" />
</f:facet>
<!-- Here i have ids from column_0 to column_2-->
<h:inputText value="#{priority[ind].value}" id="column_#{ind}">
<f:validator validatorId="priorityValueValidator"/>
</h:inputText>
<!-- Line * -->
</rich:columns>
</rich:dataTable>
<br/>
<a4j:commandButton value="Apply" action="#{bean.apply}" reRender="formId"/>
</h:form>
Проблема в том, что h: message не перехватывает сообщение. Но если я помещу то же самое в ‘Line *’, все работает, но выглядит очень некрасиво.
Кажется, это действительно легко решить. Не могли бы вы, пожалуйста, помочь мне с этим?
Комментарии:
1. Вы пробовали использовать тег rich: messages?
2. Да, я сделал, это работает нормально. Но я думаю, что на практике использовать h: messages не очень хорошо, потому что он перехватывает все сообщения со страницы и требуется добавить множество дополнительных проверок. Я просто думаю, что я могу что-то пропустить при использовании h: message.
Ответ №1:
Вы используете a4j:CommandButton, поэтому лучше использовать тег richfaces для сообщения.
Rich: сообщения отлично работают для вашего случая. Используйте это 😉
Комментарии:
1. хорошо, спасибо. Я изменил на сообщения и добавил дополнительную проверку. это работает 🙂
Ответ №2:
Я думаю, что основная причина проблемы заключается в том, что for =»column_0″ и id =»column_ #{ind}» не совпадают.
Чтобы проверить это.
Изменить
<h:message styleClass="validationError" for="column_0" />
Для
<h:messages/>
и посмотрите, улавливает ли оно какое-либо сообщение.
Если появляется какое-либо сообщение, отметьте его идентификатор, чтобы сверить с идентификатором вашего компонента.
РЕДАКТИРОВАТЬ: Старайтесь не использовать значение «_» в вашем теге id.
Из ДОКУМЕНТА JBOSS
Примечание:
Начиная с версии 3.3.0GA требуется явное определение «id» для дочерних компонентов, чтобы гарантировать, что процесс декодирования работает должным образом. Пример того, как вы можете определить уникальный «идентификатор» для дочернего компонента:
<rich:columns value="#{bean.columns}" var="col" index="ind" ... >
<h:inputText id="input#{ind}" value="">
<a4j:support id="support#{ind}" event="onchange" reRender="someId" />
</h:inputText>
</rich:columns>
Только если «id», определенный как показано выше, Ajax после события onchange, будет обработан должным образом.
Комментарии:
1. Я проверил это, и они совпадают. Когда я буду уверен, что все работает для column_0, я займусь общим случаем.
Ответ №3:
Хотя этот вопрос был опубликован давным-давно, я только что увидел обходной путь, заключающий h: сообщение в a4j: outputPanel и добавляющий атрибут тега ajaxRendered = true. В моем проекте это сработало безупречно.
Согласно сообщению, которое я прочитал, причина этого в том, что для содержимого Ajax JSF при первой загрузке jsf не распознает компонент h: message. Выполняя, как было предложено, a4j: outputPanel вставляет отсутствующие дочерние компоненты в дерево компонентов. Что касается атрибута ajaxRendered, причина его использования заключается в том, что он устанавливает outputPanel (со всеми его дочерними компонентами) для отображения с новыми значениями после каждой обработки запроса AJAX.