3

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

我的页面结构如下:

<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(); 

    }
}

无论如何要在 p:commandButton 标记中将当前打开的选项卡的 id 指定为 process 属性的一部分?

更新 当 Tab1 打开时,在提交时,我只想验证 reqField1 而不是 reqField2。反之亦然,当 Tab2 打开时,我只想验证 reqField2 而不是 reqField1。

4

1 回答 1

1

尝试这个。

  1. 将手风琴面板的 绑定activeIndex到支持 bean 的 int 属性

    activeIndex="#{myBean.selectedTab}"
    
  2. 使用 bound获取id当前选定选项卡的activeIndex。要在您的 中执行此操作,请actionListener在手风琴面板上找到一个句柄

    编辑:由于您actionListener已设置为immediateactiveIndex并且 selectedTab将需要通过 ajax 进行更新。将以下内容添加<p:ajax/>到您的手风琴面板

    <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. 使用id从上面 2 中获得的内容,您可以将其包含在 JSF 列表中,以便在服务器端使用 ajax 重新呈现。在同一个动作监听器方法中:

     FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add(currentlyLoadedTabId);
    

或者,您可以考虑在每个选项卡中放置一个命令按钮,并在每个选项卡中放置一个表单。这样,每个命令按钮只处理它自己的父窗体

于 2012-11-11T04:14:44.203 回答