Редактирование ячейки Primefaces оставляет в режиме редактирования, если проверка не удалась

Aug 17 2020

Я использую p:dataTableс редактированием ячеек и валидатором p:selectOneMenuс editable = true. Я хочу, чтобы состояние редактирования ячейки оставалось в режиме редактирования (второй снимок экрана), если выбранное значение p: selectOneMenu или введенное значение недействительно, и отображать красную рамку вокруг ввода, как я могу, если я использую обычную форму (третий снимок экрана). Когда проверка не проходит, отображаются рычание и сообщения, но красное поле вокруг раскрывающегося списка не сохраняется, и я боюсь, что пользователь может не заметить (первый снимок экрана). Я не могу понять, как делать обновления ajax, чтобы отображалось красное поле, но оставьте ячейку в режиме редактирования, чтобы раскрывающийся список и красное поле все еще были видны.

<p:dataTable id="table" value="#{bean.data}" var="lineItem" editable="true" editMode="cell">

<p:column headerText="* Account">
  <p:cellEditor>
    <f:facet name="output">
       <h:outputText value="#{lineItem.account}" />
    </f:facet>

    <f:facet name="input">
      <p:selectOneMenu id="so" value="#{lineItem.account}" editable="true" dynamic="true"  converter="omnifaces.SelectItemsConverter" title="Type an account or select a stored favorite" validator="com.gdeb.rozycki.app.acountValidator" >

      <f:selectItem noSelectionOption="true" itemLabel="---Favorites" itemValue="null" />
      <f:selectItems value="#{bean.favorites}" var="fav" itemLabel="#{fav.acctNum}" itemValue="#{fav}" />
                                            
      <p:ajax disabled="#{facesContext.validationFailed}" update="table growl messages" listener="#{bean.updateAccountInline(lineItem)}" />
      </p:selectOneMenu>
    </f:facet>
  </p:cellEditor>
</p:column>

На этом снимке экрана я пытался изменить учетную запись на сохраненную избранную, которая была сохранена с пробелом, и нам больше не нужны пробелы. (Да, теперь у меня есть проверка, чтобы не допускать пробела, когда пользователь сохраняет свои любимые номера учетных записей, но есть и другие проверки, которые мы будем реализовывать) Когда проверка не удается, отображаются только заголовок и сообщение рычания. Красная линия не будет видна, пока они снова не щелкнут раскрывающийся список, как показано на втором снимке экрана.

Ответы

jeff Sep 12 2020 at 01:31

ajaxВызов имел DataTable идентификатора tableв его updateатрибуте. Я удалил этот ClientID и удалилdisabled="#{facesContext.validationFailed}"

Я думаю, что cellEditфункция автоматически обновляет компонент ClientId, который реализует cellEdit. Так что нет необходимости явно указывать в моем теге ajax.

И я также предполагаю, что тег ajax всегда запускает обновление, а слушатель - только успешно.

Возможно, я не совсем понимаю, почему, но вот что работает для меня:

  <p:ajax update="growl messages" listener="#{bean.updateAccountInline(lineItem)}" />