0

これが私が達成しようとしているものです: 同じタイプのオブジェクト (すべて異なるコンテキスト) を選択するために使用される多くの (オートコンプリート) 入力で構成されるページがあります。すべての入力は、ユーザーが特定のルックアップを実行できるポップアップを開く機能を提供する必要があります (より多くのフィルター オプションを使用し、検索結果のリストから目的のオブジェクトを選択します)。

したがって、これは完璧な再利用可能なコンポーネントになると考え、次の複合コンポーネントを作成しました。

<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 ではデータテーブルの行を選択できませんでした) であり、Page で使用される ManagedBean とは独立しています (別のページで再利用するため)。

私の問題は、このポップアップを使用する入力が 5 つある場合、ページに 5 つのポップアップを配置する必要があり、コンポーネント ツリーとその結果のページ サイズが肥大化し、一度に 1 つしかアクティブにできないことです。ページで 1 つのルックアップ コンポーネントのみを使用し、それを必要とするすべての入力で再利用できるようにするには、どうすればよいでしょうか。私が直面している問題は、ルックアップが適用時に設定する必要があるターゲット値を引き渡す方法がわからないことです (setPropertyActionListener を参照)。

補足として、ルックアップが表示されるたびにコンテンツがリセットされる (バッキング Bean のリセットとページ コンテンツのレンダリング) ため、最後の検索結果を覚えておく必要はありません。

前もって感謝します。

4

1 に答える 1

0

間違いなくそれは可能だろう。

このような場合は、レンダリングのためにJSFを多かれ少なかれスキップして、複合コンポーネントが現在実行していることを実行するJavascriptを作成します。次に、コンポーネントを変更して、必要なデータでJavascriptを初期化し、Javascriptからの入力を処理して、マネージドBeanに解析できるようにします。

于 2013-03-18T21:47:55.637 に答える