5

PrimeFaces p:blockUI が特定のコンポーネントを動的にブロックするようにするにはどうすればよいですか? つまり、EL 状態にあります。

使用事例:

ここでの条件は、基本的にはユーザーがページ上で使用できるモードです。超過した衝突があり、それらが現在ユーザーの要求に応じて表示されている場合は、ナビゲーション ツリーをブロックします (超過した衝突モードを表示し、ナビゲーション ツリーをブロックします)。通常のビューにあり、ナビゲーション ツリーのブロックを解除する必要があります (通常の衝突モードを表示し、ナビゲーション ツリーのブロックを解除します)。

現在の問題は、「超過モード」のときにステータス変更ダイアログがステータスを非超過に変更すると、ページは通常のモードに正しくレンダリング/更新されますが、ナビゲーション ツリーの影はまだそこにあります。今は通常モードなので、超過した衝突がなくなったらブロックを解除する方法が必要です。

了解した?:-)

OK、これが最初の Bean プロパティです。

/*
 * The logic of this method ensures that after status update the
 * mode is automatically put back into regular view if no followup
 * date exceeded collisions exist.
 */
public boolean isFollowupExceededCollisionsShown()
{
    return getFollowupExceededCount() > 0 ? this.followupExceededCollisionsShown : false;
}

最初の試行:

VDL ドキュメントhttp://www.primefaces.org/docs/vdl/3.4/primefaces-p/blockUI.htmlを見ると、いくつかのブロックされた属性が明らかになりました。

    <p:blockUI widgetVar="explorerBlocker"
               block=":explorer-form"
               blocked="#{collisionManager.followupExceededCollisionsShown}" />

ただし、上記はまったく何もしません。

2回目の試行:

ショーケースhttp://www.primefaces.org/showcase/ui/blockUI.jsfを見ると、クライアント API の方が適切に見えました。

アイデアは、ステータス変更ダイアログで [OK] を押したときに、ValueExpression に応じて show() または hide() を呼び出すことでした。

    <p:dialog id="state-change-dialog"
              widgetVar="stateChangeDialog"
              modal="true"
              appendToBody="true">

        <h:form>

            <ui:include src="/view/collisionmgmt/collisionStatusChangeGrid.xhtml" />

            <h:panelGroup layout="block" styleClass="center-button-panel">
                <p:commandButton id="save-button"
                                 icon="ui-icon ui-icon-disk"
                                 value="OK"
                                 action="#{collisionManager.performStatusChange}"
                                 process="@form"
                                 update=":explorer-form:tree :collision-form:period-grid :collision-form:list :collision-form:growl"
                                 oncomplete="stateChangeDialog.hide();" />
                <p:commandButton icon="ui-icon ui-icon-close"
                                 value="Cancel"
                                 update=":collision-form:list"
                                 onclick="stateChangeDialog.hide();"
                                 immediate="true" />
            </h:panelGroup>
        </h:form>

    </p:dialog>

アイデアは、OK ボタンの oncomplete="" を EL の新しい値を呼び出して、explorerBlocker.show();またはexplorerBlocker.hide();EL の新しい値に応じて何らかの方法で拡張することでした#{collisionManager.followupExceededCollisionsShown}

私が試した2つの基本的な変種があります:

oncomplete="stateChangeDialog.hide(); #{collisionManager.followupExceededCollisionsShown ? 'explorerBlocker.show();' : 'explorerBlocker.hide();' }"

oncomplete="stateChangeDialog.hide(); if ( #{collisionManager.followupExceededCollisionsShown} ){ explorerBlocker.show(); } else { explorerBlocker.hide(); }"

ステータス変更ダイアログは常に閉じられていますが、上記のロジックは作動していません。

私はここで何か本質的に間違っているに違いありません。OK ボタンの oncomplete EL 式がクリックされたときに再評価されないのではないかと疑っています。更新リストに @this を追加しても、何も変わりません。

                 update="@this :explorer-form:tree :collision-form:period-grid :collision-form:list :collision-form:growl"
  1. 「最良」は最初にJSFのみ、次にPrimeFaces固有(そして理想的には、これが文書化されている場所)です。

  2. ELでblockUI locked="#{?}"属性を使用することは可能ですか?

ありがとう

4

1 に答える 1