RichFaces : Component ID _viewRoot:status has already been found in the view.
ทดลองใช้ RichFaces แล้วต้องการให้แสดงสถานะแจ้งว่ากำลังทำงานอยู่ (Process Dialog) ซึ่งใน RichFaces นั้นมี Tag
<a4j:status />
ให้ใช้งานอยู่แล้ว เลยทดลองดังนี้
<a4j:status onstart="{Richfaces.showModalPanel('process-wait')};"
onstop="{Richfaces.hideModalPanel('process-wait')};" />
<rich:modalPanel id="process-wait" width="250" height="100">
<f:facet name="header">
<h:outputText value="Processing" />
</f:facet>
<div align="center">
<h:outputText value="Processing please wait..." /> <br>
</div>
</rich:modalPanel>
พอทดลองรันแล้วเกิด Error ดังนี้
java.lang.IllegalStateException: Component ID _viewRoot:status has already been found in the view. at com.sun.faces.util.Util.checkIdUniqueness(Util.java:724) at com.sun.faces.util.Util.checkIdUniqueness(Util.java:708) at com.sun.faces.application.StateManagerImpl.saveView(StateManagerImpl.java:129) at javax.faces.application.StateManager.saveSerializedView(StateManager.java:183) - -
Error ที่เกิดขึ้นเนื่องจากในหน้าจอ หรือ page นี้มีการใช้ tag จะไม่สามารถใช้ได้อีก วิธีการแก้ไข
1. ลบ Tag ที่ซ้ำออกแล้วสามารถใช้งานได้เลย
2. manual เปิด dialog เองในปุ่มที่ต้องการให้แสดง เช่น
<a4j:commandButton id="bt-action"
value="Save" action="#{example.save}"
onclick="{Richfaces.showModalPanel('process-wait')};"
oncomplete="{Richfaces.hideModalPanel('process-wait')};" />
Update : 08/05/2012 สามารถใช้ tag
<a4j:region id="xx-yy">
<a4j:commandButton id="bt-action"
value="Save" action="#{example.save}" />
</a4j:region>
<a4j:status for="xx-yy" onstart="{Richfaces.showModalPanel('id-here')};"
onstop="{Richfaces.hideModalPanel('id-here')};" />

