프라임 페이스 셀 편집은 유효성 검사가 실패하면 편집 모드로 유지됩니다.

Aug 17 2020

나는 editable = true와 p:dataTable함께 셀 편집 및 유효성 검사기와 함께 사용 하고 p:selectOneMenu있습니다. 선택한 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호출은 데이터 테이블 ID를 가지고 table그의 update속성을. 해당 ClientID를 제거하고 제거했습니다.disabled="#{facesContext.validationFailed}"

cellEdit함수가 cellEdit를 구현하는 ClientId 구성 요소를 자동으로 업데이트 한다고 생각합니다 . 따라서 내 ajax 태그에 명시 적으로 지정할 필요도 없습니다.

그리고 나는 또한 ajax 태그가 항상 업데이트를 실행하지만 리스너는 성공할 때만 실행한다고 생각합니다.

이유를 완전히 이해하지 못할 수도 있지만 이것이 저에게 효과적입니다.

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