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 を指定する方法はありますか?

UPDATE Tab1が開いている場合、送信時に、reqField2ではなくreqField1のみを検証したいと考えています。逆に、Tab2 が開いているときは、reqField1 ではなく reqField2 のみを検証したいと考えています。

4

1 に答える 1

1

これを試して。

  1. activeIndexaccordionPanel の をバッキング Bean の int 属性にバインドします。

    activeIndex="#{myBean.selectedTab}"
    
  2. idbound を使用して、現在選択されているタブの を取得しますactiveIndex。でこれを行うactionListenerには、アコーディオン パネルのハンドルを取得します。

    編集: youractionListenerが に設定されているためimmediate、 ajax を介してactiveIndexand selectedTabを更新する必要があります。<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);
    

または、これらの各タブにコマンド ボタンを配置し、各タブにもフォームを配置することを検討することもできます。このように、各コマンド ボタンはそれ自体の親フォームのみを処理します。

于 2012-11-11T04:14:44.203 に答える