这是我想要实现的目标:我有一个页面,其中包含许多(自动完成)输入,用于选择相同类型的对象(都在不同的上下文中)。每个输入都必须提供打开弹出窗口的能力,用户可以在其中进行特定查找(使用更多过滤器选项并从搜索结果列表中选择所需的对象)。
所以我认为这将是完美的可重用组件并编写了以下复合组件:
<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 并呈现页面内容),无需记住最后的搜索结果。
提前致谢。