我有以下代码:
<h:form>
<h:inputText id="inputField" value="#{bean.myProperty}">
<f:validateLongRange
minimum="#{bean.minimum}"
maximum="#{bean.maximum}"/>
</h:inputText>
<h:commandButton id="submit" value="Submit" >
<f:ajax execute="inputField" render="outputField errors" />
</h:commandButton>
<h:outputText id="outputField" value="#{bean.myPropertyFormatted}"/>
<h:message id="errors" for="inputField"/>
</h:form>
Run Code Online (Sandbox Code Playgroud)
当对inputText的验证失败时,我想从用户删除/隐藏outputText。做到这一点的最优雅,最面向未来的方法是什么?
我尝试rendered="#{!facesContext.validationFailed}"在outputText元素上设置属性,但这仅决定了outputText元素是否被重新渲染,而不是使旧文本保持不变。但是,当validateLongRange验证失败时,我想从用户完全删除/隐藏outputText,因为用户将选择验证错误消息,并且不希望基于先前的有效输入选择旧的输出消息,即仍然将值存储在Bean中。
作为JSF的经验法则,如果要有条件地呈现任何内容,则应将其包装在容器组件(<foo:panel/>)中,并使该容器组件成为ajax更新的目标。
<h:form>
<h:inputText id="inputField" value="#{bean.myProperty}">
<f:validateLongRange
minimum="#{bean.minimum}"
maximum="#{bean.maximum}"/>
</h:inputText>
<h:commandButton id="submit" value="Submit" >
<f:ajax execute="inputField" render="thePanel errors" />
</h:commandButton>
<h:panelGrid id="thePanel">
<h:outputText rendered="#{!facesContext.validationFailed}" id="outputField" value="#{bean.myPropertyFormatted}"/>
</h:panelGrid>
<h:message id="errors" for="inputField"/>
</h:form>
Run Code Online (Sandbox Code Playgroud)
对于要进行ajax更新的组件,它必须已经在浏览器的DOM中,这就是ajax的工作方式。因此,当最初渲染视图时,outputField由于rendered条件评估为false ,该视图不存在。因此,由于上述原因,任何随后的ajax更新请求都将失败。容器组件策略是要确保对标记区域进行全面更新,而不管之前有什么内容