1

複合コンポーネントの xhtml:

<composite:interface componentType="metroComponent">
        <composite:attribute name="uniqueId" />
    </composite:interface>


    <composite:implementation>

        <rich:panel width="100%" header="#{msgs['pages.metroEth.header2']}">
            <table class="resData">
                <tr>
                    <td class="labelLeft"><h:outputLabel id="optionLabelId"
                            value="#{msgs['pages.ccparams.serviceOption']}" /></td>
                    <td><h:inputText id="optionTextId"
                            binding="#{cc.serviceOption}" size="15" /> <h:message
                            for="ccvodTextId" style="color:red" /></td>

            </table>
        </rich:panel>

    </composite:implementation>

</ui:composition>

コンポーネントタイプの実装は次のとおりです。

@FacesComponent (value="metroComponent")
public class HtmlMetroCC extends UIComponentBase implements NamingContainer {

    UIInput serviceOption;

    public UIInput getServiceOption() {
        return serviceOption;
    }

    public void setServiceOption(UIInput serviceOption) {
        this.serviceOption = serviceOption;
    }

    @Override
    public String getFamily() {

        return "javax.faces.NamingContainer";
    }


}

上記の複合コンポーネントのリストを使用して panelGroup 要素を準備するバッキング Bean もあります。読みやすくするためにゲッター/セッターを削除しました

@ManagedBean (name="metroethernetBean")
@RequestScoped
public class MetroEthernetMBean implements IBean{

    private MetroEthCCData metroCCData;

    private HtmlPanelGroup metroCCPanel;
    private List<HtmlMetroCC> metroCClist;



    @PostConstruct
    public void initBean(){

        metroCClist = new ArrayList<HtmlMetroCC>();
        metroCCPanel = new HtmlPanelGroup();

        HtmlMetroCC initialMetroCC = new HtmlMetroCC(); 
        metroCClist.add(initialMetroCC);

        processMetroCCPanel();

    }


    private void processMetroCCPanel(){
        metroCCPanel.getChildren().clear();

        for (HtmlMetroCC comp: metroCClist){
            metroCCPanel.getChildren().add(comp);
        }   

    }   
}

panelGroup の表示を担当するページ フラグメントは次のようになります。

<h:panelGroup id="metroCCPanelGrouId" binding="#{metroethernetBean.metroCCPanel}" />

問題は、複合コンポーネントがパネルに表示されないのはなぜですか? パネルには子がまったく追加されていないように見えます..

ページに次のように配置すると:

<gui:metroCC />

次にコンポジットコンプ。ページに正しく表示されます。私が達成したいのは、新規追加または選択した削除をクリックして動的に追加または削除できる複合コンポーネントを含むページ上のパネルです。

4

1 に答える 1

1

管理された Bean で動的に作成されたパネルをバインドする代わりに、回避策があります

<h:panelGroup id="metroCCPanelGrouId" binding="#{metroethernetBean.metroCCPanel}" />

mBean を使用してリストを初期化/新規追加/削除し、ページ上でループします。

<h:panelGroup id="metroCCPanelGrouId">
    <ui:repeat var="test" value="#{metroethernetBean.metroCClist}">
        <gui:metroCC binding="#{test}" />
    </ui:repeat>
</h:panelGroup>

しかし、なぜ私の最初のアプローチでそれを行うことが失敗するのかまだ理解できません...... BaluC、あなたはどこにいますか;)

于 2013-02-21T14:49:01.910 に答える