【问题标题】:how to bind dynamic list of composite components to panelGroup如何将复合组件的动态列表绑定到 panelGroup
【发布时间】:2013-02-05 12:12:35
【问题描述】:

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


}

还有一个支持 bean,它使用上面呈现的复合组件列表准备 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 />

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

【问题讨论】:

    标签: jsf


    【解决方案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,你在哪里;)

    【讨论】:

      猜你喜欢
      • 2011-09-01
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-16
      • 1970-01-01
      相关资源
      最近更新 更多