h: сообщение не перехватывает сообщение. проверка для DataTable, jsf

#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.