1

ViewScoped ManagedBean があります。この Bean には、データテーブルを表示するかどうかを制御するブール属性があります。下記参照:

<p:dataTable value="#{loc.locationRows}" var="obj" ... rendered="#{loc.renderLocationTable}">   
    <p:column>
        ...
    </p:column>

    ...
</p:dataTable>

私の ManagedBean は次のようになります。

@ManagedBean(name = "loc")
@ViewScoped
public class LocationController implements Serializable {
    private boolean renderLocationTable = false;

    // JSF ActionListener.
    public void methodA() {
        if(someCondition) {
            renderLocationTable = true; // this is the only time we should render location table
        }
    }
}

methodA() が呼び出されて何らかの条件が満たされるとすぐに、テーブルがレンダリングされます。これはうまくいきます。しかし、問題はこれです。呼び出される他のすべての JSF ActionListener メソッドに対して、レンダリングされたブール値を明示的に false に戻す必要があります。下記参照:

@ManagedBean(name = "loc")
@ViewScoped
public class LocationController implements Serializable {
    private boolean renderLocationTable = false;

    // JSF ActionListener.
    public void methodA() {
        if(someCondition) {
            renderLocationTable = true; // this is the only time we should render location table
        }
    }        

    // JSF ActionListener.
    public void methodB() {
        renderLocationTable = false;
    }

    // JSF ActionListener.
    public void methodC() {
        renderLocationTable = false;
    }
}

実際の ManagedBean と XHTML ファイルの非常に小さなスニペットを示しました。実際には、これらのファイルは巨大で、他のいくつかのブール値の「レンダリング」フラグで多くのことが起こっています。これらのフラグを正確に保つことはますます難しくなっています。さらに、各 ActionListener メソッドは、目の前のビジネスに関連していない場合でも、すべてのブール値フラグを認識している必要があります。

これは私がやりたいことです:

<f:event type="postRenderView" listener="#{loc.resetRenderLocationTable}" />
<p:dataTable value="#{loc.locationRows}" var="obj" ... rendered="#{loc.renderLocationTable}">   
    <p:column>
        ...
    </p:column>

    ...
</p:dataTable>

次に、ManagedBean にメソッドがあります。

public void resetRenderLocationTable(ComponentSystemEvent event) {
    renderLocationTable = false;
}

これはいいと思いませんか?ブール変数をリセットしてゲームをする必要はもうありません。テーブルが表示されるべきではないときに表示されないようにする必要があるテストケースはもうありません。適切な JSF ActionListener メソッドがそれを true に設定すると、レンダリングされたフラグを true に設定できます。その後、「ポストバック」呼び出しによってフラグが false...Perfect にリセットされます。しかし、明らかに、JSF でこれをすぐに使用する方法はありません。

それで、誰かがこの問題の解決策を持っていますか?

ありがとう!

ところで、この状況は、おそらくあなたが思っているよりもずっと多く発生しています。ActionListeners を使用する複数の commandButtons を持つフォームがある場合はいつでも、この状況が発生する可能性があります。JSF ManagedBean を使用したことがあり、クラス全体にブール値フラグを true または false に設定していることに気付いた場合は、この状況が当てはまります。

4

1 に答える 1

0

Primefaces タグを追加していませんが、コードによると、Primefaces を使用していることがわかります。たとえば、あなたmethodA()がから呼び出されたとしますp:commandButton。まず、primefaces リモート コマンドを作成することをお勧めします。

<p:remoteCommand name="resetRenderLocationTable">
  <f:setPropertyActionListener value="#{false}" target="#{loc.renderLocationTable}"/>
</p:remoteCommand>

これにより、 という名前の JavaScript 関数が作成されresetRenderLocationTable、その呼び出しによって AJAX リクエストが生成され、renderLocationTableプロパティが に設定されますfalseoncomplete次に、その関数への呼び出しをあなたcommandButton(または他の AJAX ソース)に追加します。

<p:commandButton action="#{loc.methodA()}" update="myDatatable" oncomplete="resetRenderLocationTable()"/>

次のリクエストでは、このプロパティのリセットについて心配する必要はありません。データテーブルを更新するだけです。

于 2013-02-22T18:58:09.213 に答える