我有一个commandButton,它在一个字段的帮助下重新显示页面。 这需要在没有JavaScript的情况下工作。 我不想触发验证,所以我添加了immediate = true。 这很好,但是,页面上的任何验证消息都会消失,而我希望它们留在那里。
<h:commandButton rendered="#{cc.attrs.helpId!= null}" styleClass="helpButton" value="?" type="submit" action="#{visibleHelp.toggle(cc.clientId)}" immediate="true" />
...
<h:panelGroup rendered="#{visibleHelp[cc.clientId] != null}" id="#{cc.attrs.name}_helpText" styleClass="help-text">
<h:outputText value="#{help[cc.attrs.helpId]}"/>
</h:panelGroup>
...
这是怎么回事,或者我错过了什么?
答案 0 :(得分:0)
这是预期的行为。 faces消息是请求范围的。提交表单会创建新请求。对于immediate="true"
,不具有该属性的输入组件将不会被验证,因此不会生成面部消息。在同步(非ajax)回发上,由于整页重新加载,初始消息“消失”。
只需通过ajax提交,以便不会完全重新加载页面。
<h:panelGroup id="helpButton">
<h:commandButton rendered="#{cc.attrs.helpId!= null}" styleClass="helpButton"
value="?" action="#{visibleHelp.toggle(cc.clientId)}" immediate="true">
<f:ajax render="helpButton helpSection" />
</h:commandButton>
</h:panelGroup>
...
<h:panelGroup id="helpSection">
<h:panelGroup rendered="#{visibleHelp[cc.clientId] != null}"
id="#{cc.attrs.name}_helpText" styleClass="help-text">
<h:outputText value="#{help[cc.attrs.helpId]}"/>
</h:panelGroup>
</h:panelGroup>
是的,这仍然涉及到JavaScript,但是没有其他可行的解决方案,或者您必须删除immediate="true"
,以便为这些输入组件重新执行验证。