使用richfaces tabPanel阻止选项卡切换上的表单提交

时间:2011-09-05 15:46:33

标签: jsf tabs richfaces submit

有一个标签面板,如:

<rich:tabPanel  >
    <rich:tab header="Description"  >
        <ui:include src="./tests/description.xhtml"/>                   
    </rich:tab>
    <rich:tab header="Something else">
        something else
    </rich:tab>
</rich:tabPanel>      

在description.xhtml中有几个字段:

<ui:composition
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:rich="http://richfaces.org/rich"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:advanced="http://java.sun.com/jsf/composite/advanced">    

    <h:panelGroup id="description">        
        // ...
        <h:outputLabel  value="Name"/> 
        <h:inputText    id="name"
                        value="#{testTree.selected.name.text}" 
                        rendered="#{description.editing}"/>      
        // ...
        <advanced:button text="Reset" //Just a little upgraded a4j:commandButton
                         icon="images/clear.png"
                         action="#{description.resetEditing()}"
                         execute="@this"                                
                         render="description"
                         rendered="#{description.editing}"/>               
        <advanced:button text="Save"
                         icon="images/save2.png"
                         action="#{description.commitEditing()}"
                         execute="description" // #name and a few more fields                  
                         render="description"
                         rendered="#{description.editing}"/> 
    </h:panelGroup>
</ui:composition>

切换到第二个标签我提交了“描述”表单,但这并不好。我想重置所有字段。

如何使用RichFaces 4实现这一目标?

2 个答案:

答案 0 :(得分:1)

默认情况下,在选项卡之间切换时,会提交父tabPanel。您可以使用tabPanel的switchType属性将此行为更改为ajax或客户端。我可以想到两种方法来防止在从一个标签更改为另一个标签时提交您的表单:

  1. 将switchType属性更改为客户端

  2. 为每个标签添加表单

  3. 我无法看到您的表单定义在哪里,但我猜的是整个表单:tabPanel在表单中。我看到你的description.xhtml页面中没有定义任何形式。您可以尝试删除您拥有的表单,然后为每个选项卡添加一个表单,即在description.xhtml:

    <ui:composition
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:rich="http://richfaces.org/rich"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:advanced="http://java.sun.com/jsf/composite/advanced">    
    
    <a4j:form>
    <h:panelGroup id="description">        
        // ...
        <h:outputLabel  value="Name"/> 
        <h:inputText    id="name"
                        value="#{testTree.selected.name.text}" 
                        rendered="#{description.editing}"/>      
        // ...
        <advanced:button text="Reset" //Just a little upgraded a4j:commandButton
                         icon="images/clear.png"
                         action="#{description.resetEditing()}"
                         execute="@this"                                
                         render="description"
                         rendered="#{description.editing}"/>               
        <advanced:button text="Save"
                         icon="images/save2.png"
                         action="#{description.commitEditing()}"
                         execute="description" // #name and a few more fields                  
                         render="description"
                         rendered="#{description.editing}"/> 
    </h:panelGroup>
    </a4j:form>
    </ui:composition>
    

    我还将tabPanel的switchType属性设置为ajax,以便只刷新tabPanel的内容。

答案 1 :(得分:0)

1)将switchType属性更改为客户端
2)为每个标签包含一个表单

我花了6个小时用谷歌搜索,最后在这里寻找另一个,
更改此属性值可以节省我的一天。