我有几页我想使用复合组件来显示,添加和删除语言标签列表。
使用复合组件的页面可能如下所示:
...
<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?