复合组件属性的双向操作

时间:2011-12-02 08:28:52

标签: jsf jsf-2 facelets composite-component

我有几页我想使用复合组件来显示,添加和删除语言标签列表。

使用复合组件的页面可能如下所示:

...
<ccc:languageTabs languages="#{viewBean1.languages}">
    // some input components
    // example:
    <h:inputText value="#{viewBean1.name[language.id]}"/>
</ccc:langaugeTabs>
...

复合组件看起来有点像这样:

...
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:web="http://industry-supply.dk/jsf"
      xmlns:cc="http://java.sun.com/jsf/composite">
    <cc:interface>
        <cc:attribute name="languages"/>
    </cc:interface>
    <cc:implementation>
        <div id="#{cc.clientId}">
        ...
        <web:iterator value="#{cc.attrs.languages}" var="language">
            // render some tabs
        </web:iterator>
        <web:iterator value="#{viewBean2.otherLanguages}" var="language">
            <h:commandLink action="#{viewBean2.add(language.id)}">
                <f:ajax execute="@this" render=":#{cc.clientId}"/>
                // label
            </h:commandLink>
        </web:iterator>
        <web:iterator value="#{cc.attrs.languages}" var="language">
            <h:commandLink action="#{viewBean2.remove(language.id)}">
                <f:ajax execute="@this" render=":#{cc.clientId}"/>
                // label
            </h:commandLink>
            <cc:insertChildren/>
        </web:iterator>
        ...
        </div>
    </cc:implementation>
...

所以问题是我有2个豆子。我有viewBean1用于包含输入组件的页面,viewBean2用于我的复合组件,因为我希望从viewBean1中删除组件的所有功能,以便可以重用它。但是带有语言的列表来自viewBean1,并由viewBean2操纵。 问题是,如何将我对viewBean2中的列表执行的更改反映在viewBean1上,而不将两个bean连接在一起?

我希望以下内容是可能的,但我认为不是。页面本身不会有任何更改。只有复合组件,它/应该/看起来像这样:

...
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:web="http://industry-supply.dk/jsf"
      xmlns:cc="http://java.sun.com/jsf/composite">
    <cc:interface>
        <cc:attribute name="languages" boundTo="viewBean2.languages"/>
    </cc:interface>
    <cc:implementation>
        <div id="#{cc.clientId}">
        ...
        <web:iterator value="#{viewBean2.languages}" var="language">
            // render some tabs
        </web:iterator>
        <web:iterator value="#{viewBean2.otherLanguages}" var="language">
            <h:commandLink action="#{viewBean2.add(language.id)}">
                <f:ajax execute="@this" render=":#{cc.clientId}"/>
                // label
            </h:commandLink>
        </web:iterator>
        <web:iterator value="#{viewBean2.languages}" var="language">
            <h:commandLink action="#{viewBean2.remove(language.id)}">
                <f:ajax execute="@this" render=":#{cc.clientId}"/>
                // label
            </h:commandLink>
            <cc:insertChildren/>
        </web:iterator>
        ...
        </div>
    </cc:implementation>
...

有谁知道这样的事情是否可行?或者如果没有,是否可以使用允许这种行为的新组件来扩展cc?

0 个答案:

没有答案