我有以下代码:
<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>
当对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>
对于要进行ajax更新的组件,它必须已经在浏览器的DOM中,这就是ajax的工作方式。因此,当最初渲染视图时,outputField由于rendered条件评估为false ,该视图不存在。因此,由于上述原因,任何随后的ajax更新请求都将失败。容器组件策略是要确保对标记区域进行全面更新,而不管之前有什么内容
| 归档时间: | 
 | 
| 查看次数: | 5753 次 | 
| 最近记录: |