这是我想要实现的:我有一个由许多(自动完成)输入组成的页面,用于选择相同类型的对象(都在不同的上下文中)。每个输入都必须提供打开一个弹出窗口的功能,用户可以在其中进行特定的查找(使用更多的过滤器选项并从搜索结果列表中选择所需的对象)。
所以我认为这将是一个完美的可重用组件,并编写了以下复合组件:
<cc:interface>
<cc:attribute name="value" type="MySelectedObjectType" />
<cc:attribute name="render" type="java.lang.String" />
</cc:interface>
<cc:implementation>
<rich:popupPanel id="dialog" header="#{msg.search}" autosized="true">
<h:form id="form">
<h:panelGroup class="searchPane" layout="block">
<h:panelGrid>
<o:outputLabel for="name" value="#{msg.name}" />
<h:inputText id="name" value="#{lookupModel.name}" />
...
</h:panelGrid>
<div class="extSearchPaneButton-cntr">
<a4j:commandButton value="Suchen" action="#{lookupModel.doSearch}" render="searchResult" styleClass="buttonDefault" />
</div>
</h:panelGroup>
<h:panelGroup id="searchResult" layout="block" class="searchResult-cntr">
<rich:dataTable id="resultTable" value="#{lookupModel.searchResults}" var="entry" >
<rich:column>
#{entry.name}
<rich:column>
...
<a4j:ajax event="rowclick" listener="#{lookupModel.selectionListener}" />
</rich:dataTable>
</h:panelGroup>
<div class="resultButton-cntr">
<a4j:commandButton id="apply" value="#{msg.apply}" execute="searchResult" oncomplete="#{rich:component('dialog')}.hide()"
styleClass="button" render="#{cc.attrs.render}">
<f:setPropertyActionListener target="#{cc.attrs.value}" value="#{lookupModel.selected}" />
</a4j:commandButton>
<a4j:commandButton id="cancel" value="#{msg.cancel}" onclick="#{rich:component('dialog')}.hide(); return false;"
styleClass="button" />
</div>
</h:form>
</rich:popupPanel>
</cc:implementation>
lookupModel是一个ViewScoped(使用RequestScope,不可能在数据表中选择一行)的ManagedBean,独立于页面上使用的ManagedBean(以便在另一个页面中重用它)。
我的问题是现在,如果我有5个输入使用这个弹出窗口,我必须把5个弹出窗口在我的页面,膨胀的组件树和由此产生的页面大小,其中只有一个可以在一个时间是活跃的。我想知道必须做些什么才能在我的页面上只使用一个查找组件,并为需要它的每个输入重用它。我面临的问题是,我不知道如何在应用时切换查找应该设置的目标值(参见setPropertyActionListener)。
作为旁注,每次显示查找时,它的内容都会被重置(重置支持bean并呈现页面内容),因此不需要记住最后的搜索结果。
我怀疑这是可能的。
对于这样的事情,我或多或少会跳过JSF来呈现,而使用Javascript来完成复合组件现在所做的工作。然后修改组件,这样它就可以用所需的数据初始化Javascript,并处理来自Javascript的输入,从而可以将其解析为托管bean。