2013-02-18 5 views
5

どのようにしてPrimeFaces p:blockUIを特定のコンポーネントを動的にブロックするのですか?EL状態ですか?PrimeFaces p:blockUIは、特定のコンポーネントを動的にブロックします(JSF EL条件で)?

のUSE CASE:

手元の条件は基本的にユーザーがページ上で可能なモードです。そこに任意の衝突を超えていると、彼らが現在のユーザーの要求に応じて表示された場合、その後(ナビゲーションツリーをブロックナビゲーションツリーがブロックされていなければなりません(通常の衝突モードを表示、ナビゲーションツリーはブロックされません)。

現在、「超過モード」でステータス変更ダイアログがステータスを超過しない状態に変更すると、ページはレンダリングされ/通常のモードに正しく戻されます。しかし、ナビゲーションツリーの影まだそこにはです。私たちは通常のモードになっているので、これ以上衝突がなくなれば、ブロックを解除する方法が必要です。

わかりましたか? :-)

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}" /> 

上記は絶対に何もしません。

第二試み:

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

<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の=「」:

アイデアは、ステータス変更]ダイアログボックスで[OK]を押したときのValueExpressionに応じて、ショーのいずれか()または非表示()を呼び出すことでしたEL #{collisionManager.followupExceededCollisionsShown}の新しい値に応じて、explorerBlocker.show();またはexplorerBlocker.hide();を呼び出します。

私が試した二つの基本的なバリエーションがあります。

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

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

は、ステータス変更ダイアログがすべての時間を閉じているが、上記のロジックがで蹴っていない

私は何かが本質的に間違って作っておく必要があります。ここに。私は、OKボタンの不完全なEL式がクリックされたときに再評価されないことを疑っています。 @thisを更新リストに追加しても何も変わりません。私の問題は、最良の解決された方法

    update="@this :explorer-form:tree :collision-form:period-grid :collision-form:list :collision-form:growl" 
  1. (これが文書化された場合、理想的と!)、ここで "最高の" JSF-のみの最初の、そしてPrimeFaces固有です。

  2. blockUI blocked = "#{?}」ELと属性

おかげ

答えて

3

一つの方法は、マネージドBeanからBlockUIの非表示()とshow()メソッドを呼び出すことである
あなたが行うことができRequestContextの使用によって:?。

RequestContext.getCurrentInstance()( "widgetVar.showを()")を実行;。

もう一つは、あなたが変数tを渡すことができていますo JavaScript関数を呼び出し、Javascript関数でそれを処理させます。

onClick="func(#{elvariable})" 

<script type="text/javascript"> 
function func(value) 
{ 
if(value==something){ 
widgetVar.show(); 
}else{ 
widgetVar.hide(); 
} 
} 
</script>