如何为多个输入重用查找(弹出)组件



这是我想要实现的:我有一个由许多(自动完成)输入组成的页面,用于选择相同类型的对象(都在不同的上下文中)。每个输入都必须提供打开一个弹出窗口的功能,用户可以在其中进行特定的查找(使用更多的过滤器选项并从搜索结果列表中选择所需的对象)。

所以我认为这将是一个完美的可重用组件,并编写了以下复合组件:

<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。

相关内容

  • 没有找到相关文章

最新更新