0

p:dataTable の選択リスナーについてアドバイスが必要です。私のビューは、北、左、中央のセクションを持つプライムフェイス拡張レイアウト (pe:layout) です。北がテーブル、左がメニューです。

左側のメニューは、選択したテーブル行のデータに対して別のビューを提供するため、行が変更された場合、ビュー全体を更新する必要があるという考え方です。(左側のメニューで選択したビューに応じて、これらは Bean backigOne、2、および 3 によってサポートされ、一度にアクティブになるのは 1 つだけです)。

そこで、すべての Bean に対して、テーブルに複数の rowSelect イベントを使用することにしました。

 <p:dataTable id="" var="wo" value="#{TableBacking.dataList}"
    selection="#{TableBacking.selectedItem}" selectionMode="single" rowKey="#{wo}">

<p:ajax event="rowSelect" listener="#{backingOne.tableChangeListnener}" 
   update="..." disabled="#{leftMenuBacking.selection != "ONE" />
<p:ajax event="rowSelect" listener="#{backingTwo.tableChangeListnener}" 
   update="..." disabled="#{leftMenuBacking.selection != "TWO"/>
<p:ajax event="rowSelect" listener="#{backingThree.tableChangeListnener}" 
   update="..." disabled="#{leftMenuBacking.selection != "THREE" />

...

 </p:dataTable>

これはうまく機能し、常に leftMenuBacking で 1 つの項目が選択されるため、一度に 1 つの ajax イベントのみが有効になります。 ただし、次の宣言により、すべての backingOne、backingTwo、および backingThree Bean が常に初期化されるという問題があります

  listener="#{backingXXX.tableChangeListnener}" 

そして私の場合、初期化にはコストがかかります:((時間的に)

より良い設計のヒントが必要なため、機能は同じですが、現在選択されている (または無効な ="#{leftMenuBacking.selection != "ONE" の意味で有効になっている) メニューのバッキング Bean のみが初期化されます。他にはありませんか?

どうもありがとう。

Magnus Tengdahlのコメントに基づくEDIT 1 :

leftmenu の選択ごとに異なるページがあります。ページ backingOne.xhtml は次のようになります。

   <ui:composition template="/publicResources/templates/gdfoxTemplate.xhtml">
<ui:define name="title">GDFox | Similar Problems</ui:define>

<!-- North contains the section with table that produces rowSelect event as described above -->
<ui:define name="north">
      <ui:include src="currentWorkload.xhtml" />
</ui:define>

<!-- Contains the left munu, uses p:menu widget-->
<ui:define name="west">
        <ui:include src="leftmenu.xhtml" />
</ui:define>

<!-- center view  based on BackingOne bean-->
<ui:define name="center">
     ....
    </ui:define>
  </ui:composition>

したがって、基本的に、左側のメニューのすべての選択は異なる URL にあります (backinOne/Two/Three.xhtml と呼びましょう。それらはすべて、北と西のセクションを共有し、独自のセンターを定義します。

これが、そのテーブルに 3 つを使用する必要がある理由です - すべての可能なビューに変更を反映するために (時間内に選択されるのは 1 つだけですが)。私は、1人の聞き手が私の問題を解決してくれるとは思っていません (== 私はまだ見ていません)。あなたのアイデアがうまくいくと確信しているなら、もう少し詳しく説明していただけますか?

4

2 に答える 2

0

条件rowSelectなしで、リスナーを1 つだけ使用します。disabled

<p:ajax event="rowSelect" listener="#{backingOne.tableChangeListnener}" 
    update="menuArea" />

次に、バッキング Bean に、選択された行が与えられたときに何をすべきかを決定させます。バッキング Bean で選択された行を取得する方法の例については、 PrimeFaces ShowCaseを参照してください。その情報から、バッキング Bean は何をすべきかを確実に知る必要があります。基本的に、バッキング Bean の 1 つで適切なバッキング Bean 実装を呼び出すだけで済みます。

左側のビューのコードは提供されていませんが、次のようなものをお勧めします (まだ行っていない場合)。

<h:panelGroup id="menuArea">
    <ui:fragment rendered="#{leftMenuBacking.selection == 'ONE'}">
        ... code for selection "ONE" ...
    </ui:fragment>
    <ui:fragment rendered="#{leftMenuBacking.selection == 'TWO'}">
        ... code for selection "TWO" ...
    </ui:fragment>
    <ui:fragment rendered="#{leftMenuBacking.selection == 'THREE'}">
        ... code for selection "THREE" ...
    </ui:fragment>
</h:panelGroup>

このようにして、左側の領域が毎回再レンダリング (更新) されrowSelect、選択テーブルはそのまま残されます。

于 2012-11-19T14:53:17.567 に答える
0

追加の Bean backingbean0 を作成できると思います。その Bean には、リスナー tableChangeListener があります。Magnus が述べたように、1 つの p:ajax があり、tableChangeListener では、必要なものに応じて backingbean1 2 または 3 を呼び出すことができます。(この情報は backingbean0 にあります)

protected Object getBean(String name) {
    FacesContext fcontext = FacesContext.getCurrentInstance();
    ELResolver resolver = fcontext.getApplication().getELResolver();
    Object bean = resolver.getValue(fcontext.getELContext(), null, name);

    if (bean == null) {
        getLog().warn("An object with name=" + name + " could not be resolved with ELResolver");
    }

    return bean;
}

そして、あなたはそれをこのように呼びます

BackingBean1 bb1 = (BackingBean1) getBean("bb1");
于 2012-11-20T09:11:29.077 に答える