我有几个<p:messages>
元素应该处理由单个bean产生的不同类型的错误。现在我从浏览器获取的一个元素的clientID总是相同的,因为里面没有生成的id(总共有3个ID)。
无论我传递给FacesContext.addMessage()的哪个clientID,我总是会在每个 <p:messages>
元素上显示所有错误消息。
浏览器中的一个clientID:regelDetailAccordion:duoDlgForm2:regelDetail
浏览器中的另一个clientID:regelDetailAccordion:duoDlgForm1:messagesNeuerFehler
Bean代码:FacesContext.getCurrentInstance().addMessage(X, new FacesMessage(...));
其中X
是clientID(非)前面有:
和/或regelDetail
前面有和没有:
的情况。尝试了所有:(
对话框的文件:
<ui:insert name="insertDuo"><ui:include src="/includes/duoRegelStmt.xhtml" />
</ui:insert>
显示我所有messages
的对话框:
<p:dialog widgetVar="newDuoDialog" id="newDuoDlg" modal="true">
<p:layout id="layout">
<p:layoutUnit position="west">
<ui:insert name="insertDetailStmt">
<h:form id="stmtDetailForm">
<ui:include src="/includes/stmtDetail.xhtml" /> <!-- left side -->
</h:form>
</ui:insert>
</p:layoutUnit>
<p:layoutUnit position="center">
<ui:insert name="insertDetailRegel">
<ui:include src="/includes/regelDetail.xhtml"/> <!-- right side -->
</ui:insert>
</p:layoutUnit>
</p:layout>
</p:dialog>
对话框的右侧显示我的3 messages
中的2个:
<ui:composition>
<h:panelGrid id="unterheaderUndAccordion">
<h:panelGrid rendered="#{...}" id="regelUnterheader"/>
<p:accordionPanel multiple="true" activeIndex="0,1" id="regelDetailAccordion" rendered="#{...}">
<p:tab>
<h:form id="duoDlgForm1">
<ui:insert name="neuerFehler">
<ui:include src="/includes/neuerFehler.xhtml" />
</ui:insert>
<h:selectOneMenu value="#{regelBean.selectedFehlerCode}" id="selFCode"
onChange="submit()" process="@this" valueChangeListener="#{regelBean.changeFehlerCode}">
<p:ajax event="change" update="duoDlgForm1" />
<f:selectItems ... />
</h:selectOneMenu>
</h:form>
</p:tab>
<p:tab>
<h:form id="duoDlgForm2">
<h:panelGrid>
<p:messages id="regelDetail" showDetail="true" closable="true"/>
</h:panelGrid>
</h:form>
</p:tab>
</p:accordionPanel>
</h:panelGrid>
</ui:composition>
neuerFehler包含一个messages
,其定义如下
<p:messages id="messagesNeuerFehler" showDetail="true" closable="true"/>
在我的想法中,当我为X
输入正确的值时,只有正确的消息字段才会显示消息,即使其他messages
已更新。如果是这样,我必须输入正确的clientID是什么?非常感谢,我很快就结束了:(
答案 0 :(得分:1)
如果我正确理解了问题,您可以使用Primefaces选择器阻止某些组件更新,如下所示:
<h:form>
<h:inputText ... />
<h:inputText ... />
<h:inputText ... styleClass="noupdate" />
<h:inputText ... />
<h:inputText ... />
<p:commandButton ... update="@(form :not(.noupdate))"/>
</h:form>
BalusC here的原始答案。
如果这没有帮助,您可以在消息组件上使用for-attribute吗?在我看来,当它是具有错误的组件的标识符时,您希望FacesMessage中的clientid成为消息组件的标识符。对不起,如果我误解了。
答案 1 :(得分:0)
尝试使用
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Your message"));
并向组件添加update="elementId"
属性,从而触发托管bean操作。
“elementId”当然是您<p:messages>
元素的相应ID。
对我来说这样做很好。也许它也解决了你的问题。