Primefaces เซลล์ออกจากการแก้ไขในโหมดแก้ไขเมื่อการตรวจสอบล้มเหลว

Aug 17 2020

ฉันใช้p:dataTableกับการแก้ไขเซลล์และตัวตรวจสอบความถูกต้องบน a p:selectOneMenuwith 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โทรมี ID ที่tableสามารถupdateระบุข้อมูลได้ในแอตทริบิวต์ ฉันลบ ClientID นั้นและลบออกdisabled="#{facesContext.validationFailed}"

ฉันคิดว่าcellEditฟังก์ชันนี้จะอัปเดตส่วนประกอบ ClientId ที่ใช้ cellEdit โดยอัตโนมัติ ดังนั้นไม่จำเป็นต้องระบุอย่างชัดเจนในแท็ก ajax ของฉัน

และฉันคาดเดาด้วยว่าแท็ก ajax จะรันการอัปเดตเสมอ แต่ผู้ฟังจะประสบความสำเร็จเท่านั้น

ฉันอาจไม่เข้าใจว่าทำไม แต่นี่คือสิ่งที่เหมาะกับฉัน:

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