2013-02-18 91 views
5

如何使PrimeFaces p:blockUI動態地阻止某個組件,即EL狀態?PrimeFaces p:blockUI動態阻塞某個組件(在JSF 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; 
} 

1日試:

在透露 一些封鎖屬性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似乎更足。

當時的想法是取決於ValueExpression按壓狀態變化對話框確定何時調用或者顯示()或隱藏():

<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 =「」撥打電話explorerBlocker.show();explorerBlocker.hide();,具體取決於EL #{collisionManager.followupExceededCollisionsShown}的新值。

有兩種基本類型,我想:

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的hide()和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>