1

入力フィールドを含む新しいタブを追加しました。しかし、何らかの理由で、マネージド Bean は追加された最新のタブ (例のタブ 3) の値しか保存できませんでした。前のタブ (サンプル タブ 2) に切り替えて値を保存しようとすると、保存された値は常に最後のタブの入力フィールド値に戻ります。stackoverflow と primefaces フォーラムの両方のフォーラムで検索しても、これに関する明確な解決策はまったくありません。繰り返しますが、詳細なチュートリアルは次のとおりです。

  1. TabView -> 新しいタブを追加 (タブ 1)
  2. タブ 1 の下に t1、f1、c1 を保存します (成功)
  3. 新しいタブを追加 (タブ 2)
  4. 新しいタブを追加 (タブ 3)
  5. タブ3の下にt3、f3、c3を保存します(成功)
  6. タブ 2 を選択
  7. タブ 2 の下に t2、f2、c2 を保存します (失敗) -> 結果: タブ 2 の値がタブ 3 の値として保存されます (t3、f3、c3)

    <ui:composition template="/template/StakeholderTemplate.xhtml">
    
        <ui:define name="top">
            <h2>Customer Information Data Entry</h2>
        </ui:define>
    
        <ui:define name="contentInsert">
            <p:ajaxStatus onstart="statusDialog.show();" onsuccess="statusDialog.hide();"/>  
            <p:dialog modal="true" widgetVar="statusDialog" header="Status"   
                      draggable="false" closable="false" resizable="false">  
                <p:graphicImage value="/adminItem/images/ajaxloading.gif" /> 
            </p:dialog> 
    
            <h:form id="form">
    
                <p:growl showDetail="true" /> 
    
                <h:panelGrid columns="1">
    
                    <p:commandButton value="Add tab" process="@this" update="tw" actionListener="#{backMicroPortalMB.addTab}">
                    </p:commandButton>
                    <p:growl id="tabsave" showDetail="true" />
                    <p:tabView id="tw" style="width:100%" activeIndex="#{backMicroPortalMB.activeIndex}" value="#{backMicroPortalMB.unstructuredTabs}"  var="tab"  dynamic="true" cache="false">
                        <p:ajax event="tabChange" process=":form" listener="#{backMicroPortalMB.onTabChange}"/>
    
                        <p:tab title="#{tab.tabTitle}" closable="true">
    
                            <h:outputLabel for="tabTitle" value="Please key in tab title:" />
                            <h:inputText id="tabTitle" value="#{backMicroPortalMB.tab.tabTitle}"/>
                            <br/>
    
    
                            <h:outputLabel for="fieldTitle" value="Please key in field title:" />
                            <h:inputText id="fieldTitle" value="#{backMicroPortalMB.opt.fieldTitle}" /><br/>
    
                            <h:outputLabel for="contentTitle" value="Please key in content:" />
                            <p:editor id="contentTitle" value="#{backMicroPortalMB.opt.content}" width="600"/><br/>
    
                            <p:commandButton value="Save" update="@form" action="#{backMicroPortalMB.saveTab}" />
    
                        </p:tab>  
                    </p:tabView>
                    <p:commandButton id="panel" value="Add" action="#{backMicroPortalMB.createMicroPortal}"/>  
                </h:panelGrid>
            </h:form>
    
        </ui:define>
    
    </ui:composition>
    

ビーンコード:

@ManagedBean
@ViewScoped
public class BackMicroPortalMB {

public void addTab(ActionEvent action) {

        FacesContext ctx = FacesContext.getCurrentInstance();
        ExternalContext ectx = ctx.getExternalContext();

        String url = "A tab";

        TabView tw = (TabView) ctx.getViewRoot().findComponent("form2:tw");
        TempTab tab = new TempTab();
        tab.setTabIndex(unstructuredTabs.size());
        tab.setTabTitle("new Tab");    
        unstructuredTabs.add(tab);

    }//add new Tab

public void onTabChange(TabChangeEvent event) {

        FacesContext ctx = FacesContext.getCurrentInstance();
        ExternalContext ectx = ctx.getExternalContext();

        TempTab tab = this.unstructuredTabs.get(activeIndex);

        this.tab.setTabTitle(tab.getTabTitle());
        this.opt.setFieldTitle(tab.getOptField().iterator().next().getFieldTitle());
        this.opt.setContent(tab.getOptField().iterator().next().getContent());

        // FacesMessage msg = new FacesMessage("Tab Changed", "Active Tab: " + event.getTab() + this.selectedIndex);  

        // FacesContext.getCurrentInstance().addMessage(null, msg);  
    }

public void saveTab() {

        FacesContext ctx = FacesContext.getCurrentInstance();
        Long stakeholderId = (Long) ctx.getExternalContext().getSessionMap().get("stakeholderId");        
        TempTab currentTab = this.unstructuredTabs.get(activeIndex);
        currentTab.setTabTitle(this.tab.getTabTitle());
        Collection<OptionalField> optFieldList = new ArrayList<OptionalField>();        
        optFieldList.add(this.opt);
        currentTab.setOptField(optFieldList);

        FacesMessage msg = new FacesMessage(tab.getTabTitle() + " Saved!");

        ctx.addMessage(null, msg);
    }//add new Tab   
}

PrimeFaces フォームで検索しましたが、viewscoped と tabview をグーグルで検索するのが唯一の役立つ回答でした。しかし、ここでの問題は正確には何ですか?私は PrimeFaces と JSF に本当に慣れていないので、アドバイスをいただければ幸いです。

PrimeFaces 3.3 JSF 2.1 Glassfish 3.1.2

4

1 に答える 1

4

タブのコレクションを値として持つ動的タブビューを使用しており、すべてのタブのすべての入力値を1つの同じBeanプロパティにバインドしています。すべてのタブからの入力を処理している間、各タブの入力値は、最後のタブに到達するまで順番に相互にオーバーライドするため、Beanは最後のタブの値のみで終了します。

タブ固有のプロパティは、すべてのタブ間で共有されるマネージドBeanプロパティではなく、タブ自体に固有のモデルオブジェクトにバインドする必要があります。あなたの場合、それは#{tab}オブジェクトです。したがって、<p:tab>コンテンツは最終的に次のようになります。

<h:outputLabel for="tabTitle" value="Please key in tab title:" />
<h:inputText id="tabTitle" value="#{tab.tabTitle}"/>

<h:outputLabel for="fieldTitle" value="Please key in field title:" />
<h:inputText id="fieldTitle" value="#{tab.fieldTitle}" /><br/>

<h:outputLabel for="contentTitle" value="Please key in content:" />
<p:editor id="contentTitle" value="#{tab.content}" width="600"/><br/>
于 2012-06-03T12:51:20.147 に答える