primefaces手风琴面板在单一形式 - 仅在打开的选项卡上验证

时间:2012-11-10 17:35:01

标签: jsf primefaces validation accordion

我已经查了一下但是我没有找到一个关于如何使用单一表格提交手风琴的明确示例。 我发现的问题是当我想处理(验证)打开的选项卡的字段时。

我的页面结构如下:

<h:form>
    <p:accordionPanel activeIndex="#{bean.selectedTab}">
        <p:ajax event="tabChange" listener="#{bean.tabChangeListener}"/>

        <p:tab title="Tab1" id="t1">
            <p:inputText id="reqField1" required="true"/>
        </p:tab>
        <p:tab title="Tab2" id="t2">
            <p:inputText id="reqField2" required="true"/>
        </p:tab>
   </p:accordionPanel>

   <p:commandButton update="list" immediate="true" actionListener="#{bean.addRecord}"/>                     
</h:form>

方法:

@SessionScoped
public class Bean{
    public void tabChangeListener(AjaxBehaviorEvent evt){
        AccordionPanel panel = (AccordionPanel) evt.getComponent();
        // getLoadedTabs() returns an empty list
        String currentlyLoadedTabId = panel.getLoadedTabs().get(this.selectedTab).getClientId(); 

    }
}

是否有指定当前打开的选项卡的id作为p:commandButton标记中process属性的一部分?

更新 的 当Tab1打开时,在提交时,我想仅验证reqField1而不是reqField2。副主席,当Tab2打开时,我想仅验证reqField2而不是reqField1。

1 个答案:

答案 0 :(得分:0)

试试这个。

  1. 将accordionPanel的activeIndex绑定到支持bean的int属性

    activeIndex="#{myBean.selectedTab}"
    
  2. 使用绑定的id获取当前所选标签的activeIndex。要在actionListener中执行此操作,请获取有关手风琴面板的信息

    编辑:由于您的actionListener已设置为immediate,因此需要通过ajax更新activeIndexselectedTab。将以下<p:ajax/>添加到您的accordionPanel

    <p:ajax event="tabChange" listener="#{bean.tabChangeListener}" />
    

    在你的支持bean中,你现在有了

    public void (AjaxBehaviorEvent evt){
     AccordionPanel panel = (AccordionPanel) evt.getComponent();
     String currentlyLoadedTabId = panel.getLoadedTabs().get(this.selectedTab).getClientId(); 
    
    }
    
  3. 使用上面2中的id,您可以在服务器端使用ajax重新渲染的JSF列表中包含它。在相同的动作侦听器方法中:

     FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add(currentlyLoadedTabId);
    
  4. 或者,您可以考虑在每个选项卡中放置一个命令按钮,并在每个选项卡中也有一个表单。这样,每个命令按钮只处理它自己的父表单