如何将组合组件的动态列表绑定到panelGroup



复合组件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";
    }

}

还有一个backingbean,它准备了带有上述复合组件列表的panelGroup元素。为了更好地阅读,我删除了getter/setter

@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 />

然后合成comp。在页面上正确显示。我想要实现的是页面上的一个面板,其中包含复合组件,可以通过单击添加新的或删除选定的来动态添加或删除。

在menagedbean 中有一个wrokaround,而不是绑定动态创建的面板

<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>

但是:我仍然不明白为什么用我的第一个教练做这件事失败了。。。。。。巴鲁,你在哪里?)

相关内容

  • 没有找到相关文章

最新更新