这是我想要实现的目标: 我有一个页面,包含许多(自动完成)输入,用于选择相同类型的对象(所有在不同的上下文中)。 每个输入都必须能够打开弹出窗口,用户可以在其中执行特定查找(使用更多过滤器选项并从搜索结果列表中选择所需对象)。
所以我认为这将是完美的可重用组件,并编写了以下复合组件:
<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个弹出窗口,膨胀组件树和结果页面大小,其中一次只能有一个活动。 我想知道必须做些什么才能在我的页面上只使用一个查找组件并将其重用于需要它的每个输入。我面临的问题是,我不知道如何切换查找应该在apply上设置的目标值(参见setPropertyActionListener)。
作为旁注,每次显示查找时,内容都会重置(重置后备bean并呈现页面内容),无需记住上次搜索结果。
提前致谢。
答案 0 :(得分:0)
怀疑是可能的。
对于这样的事情,我或多或少会跳过JSF进行渲染并制作一个Javascript来完成复合组件现在所做的事情。然后更改组件,以便简单地使用所需数据初始化Javascript并处理来自Javascript的输入,以便将其解析为托管bean。