我已经检查各地,但我没有找到如何使用单一表单提交手风琴一个明显的例子。我觉得问题是,当我要处理(生效)只有打开的选项卡的领域。
我的网页的结构如下:
<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标签?
UPDATE TAB1时是开放的,在提交,我想验证只有reqField1而不是reqField2。反之亦然,当TAB2是开放的,我想验证只有reqField2而不是reqField1。
尝试这个。
activeIndex
到后台bean属性INT
activeIndex="#{myBean.selectedTab}"
id
获取当前选定的选项卡的activeIndex
。要在actionListener
做到这一点,得到了手风琴面板上的手柄
编辑:既然你actionListener
已被设置为immediate
的activeIndex
和selectedTab
需要通过AJAX更新。以下<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();
}
id
,可以包含在物联网使用在服务器端AJAX来重新描绘的JSF列表。在同样的动作监听器方法:
FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add(currentlyLoadedTabId);
或者,你可能只是考虑将在每个这些标签的命令按钮并具有每个选项卡形式为好。这样,每个命令按钮只处理它自己的父窗体