2014-03-06 24 views
0

我有以下代碼:如何呈現一個面板,並停止渲染使用selectOneMenu用於另一個面板JSF

<h:panelGroup rendered="#{UserAccessHandler.isAitfCompany}"> 
    <!-- For the dropdown sensorlist --> 
    <h:outputLabel value="#{labelBundle.device}" 
     style="font-weight:bold; padding-right:15px;" /> 
    <h:selectOneMenu id="testing" 
     value="#{SystemHealthPageModel.selectedSensorId}" 
     styleClass="facility_dropDown_list"> 
     <f:selectItem itemValue="----" /> 
     <f:selectItems 
      value="#{SystemHealthPageModel.childFacilitySelectionList}" /> 
     <a4j:ajax event="valueChange" execute="@this" 
      render="systemHealthAlert" /> 
    </h:selectOneMenu> 


</h:panelGroup> 

<rich:panel id="allSystemHealthAlert"> 
<alert:system_health_alert alertList="#{SystemHealthPageModel.allSystemAlerts}" 
       numberOfRows="#{SystemHealthPageModel.numberOfAlertsToDisplayOnOnePage}" 
       displayAssetRelatedData="true" 
       moreThanOnePageOfResults="#{SystemHealthPageModel.showMoreThan1PageOfAlerts}"/> 
</rich:panel> 

<rich:panel id="systemHealthAlert"> 
<alert:system_health_alert alertList="#{SystemHealthPageModel.systemAlerts}" 
       numberOfRows="#{SystemHealthPageModel.numberOfAlertsToDisplayOnOnePage}" 
       displayAssetRelatedData="true" 
       moreThanOnePageOfResults="#{SystemHealthPageModel.showMoreThan1PageOfAlerts}"/> 
</rich:panel> 

其實我有兩個面板。當我在當時使用selectOneMenu呈現「systemHealthAlert」面板時,我想停止渲染名爲「allsystemHealthAlert」的其他面板。對於您的信息,「allsystemHealthAlert」會在初始頁面加載期間自動加載。當我使用selectOneMenu呈現「systemHealthAlert」面板時,我不想呈現此面板。有沒有辦法做到這一點。

感謝

+0

請給予充分的代碼,所以它很容易瞭解。 – BholaVishwakarma

+0

代碼編輯。完整的代碼在那裏。 @Bhola。 – Novis

回答

2

包裝你的面板在更廣闊的容器,並從<h:selectOneMenu />改爲指向它。然後,根據#{SystemHealthPageModel.selectedSensorId}值執行<rich:panel />元素的條件着色。

<h:selectOneMenu id="testing" 
    value="#{SystemHealthPageModel.selectedSensorId}"> 
    <f:selectItem itemValue="----" /> 
    <f:selectItems 
     value="#{SystemHealthPageModel.childFacilitySelectionList}" /> 
    <a4j:ajax event="valueChange" execute="@this" 
     render="grouperPanel" /> 
</h:selectOneMenu> 

<h:panelGroup id="grouperPanel"> 
    <rich:panel id="allSystemHealthAlert" rendered="#{empty SystemHealthPageModel.selectedSensorId}"> 
     <alert:system_health_alert alertList="#{SystemHealthPageModel.allSystemAlerts}" 
      numberOfRows="#{SystemHealthPageModel.numberOfAlertsToDisplayOnOnePage}" 
      displayAssetRelatedData="true" 
      moreThanOnePageOfResults="#{SystemHealthPageModel.showMoreThan1PageOfAlerts}"/> 
    </rich:panel> 

    <rich:panel id="systemHealthAlert" rendered="#{not empty SystemHealthPageModel.selectedSensorId}"> 
     <alert:system_health_alert alertList="#{SystemHealthPageModel.systemAlerts}" 
      numberOfRows="#{SystemHealthPageModel.numberOfAlertsToDisplayOnOnePage}" 
      displayAssetRelatedData="true" 
      moreThanOnePageOfResults="#{SystemHealthPageModel.showMoreThan1PageOfAlerts}"/> 
    </rich:panel> 
</h:panelGroup> 
0

我們將使用偵聽器方法實現此目的,然後重新渲染組件。

(1)代碼

您的XHTML頁面:

<h:panelGroup id="panels"> 
    <rich:panel rendered="#{managedBean.showAllSystem}"> 
     <h:outputText value="ONEONE" /> 
    </rich:panel> 
    <rich:panel rendered="#{not managedBean.showAllSystem}"> 
     <h:outputText value="TWOTWO" /> 
    </rich:panel> 
</h:panelGroup> 

而且

<a4j:ajax listener="#{managedBean.menuValueChanged}" render="panels" /> 

您管理的bean:

int selectedSensorId; 
boolean showAllSystem; 

// getters and setters 

public void menuValueChanged() { 
    // business logic  
    // for example 
    if(selectedSensorId == 0) { 
     showAllSystem = true; 
    } else { 
     showAllSystem = false; 
    } 
} 

(2)工作流程

1-首先,爲了使用AJAX更新組件,您應該能夠通過其客戶端ID來調用它。如果組件有時未被渲染,它將得到一個您事先不知道的生成的客戶端ID。一個解決方案是封裝用總是渲染分量待渲染的成分(更好地解釋here

2 - 在你的管理豆你將創建一個切換標誌,姑且稱之爲showAllSystem,如果是true它會顯示allSystemHealthAlert並隱藏systemHealthAlert。該標誌將被面板的rendered屬性使用。

3-然後你會創建監聽器方法,我們稱之爲menuValueChanged()將設置showAllSystem標誌取決於selectedSensorId並將被監聽你的a4j:ajax標籤被稱爲

+0

1)你的監聽器定義缺少'()',它們對你的方法定義不是可選的。 2)您需要重新呈現頁面上存在的ID(請參閱@ XtremeBiker的方法),否則當響應返回時,JSF將無法找到要重新呈現的目標。 – mabi

+0

數字(1)完全不正確,在EL中我們可以調用沒有圓括號的方法,如果我們沒有傳遞參數的話http://docs.oracle.com/javaee/7/tutorial/doc/jsf-el003.htm #BNAHZ,我會通過編寫100次來懲罰我自己的數字(2):'用總是呈現的組件封裝待渲染的使用ajax組件.. ..我會編輯我的答案。乾杯! –

+0

你試過(1)嗎?如果它有效,告訴我。我所理解的是,只有在預期的方法簽名不帶參數時才允許將這些參數關閉。 'listener'方法[採取](AjaxBehaviorEvent)(http://docs.oracle.com/javaee/7/javaserverfaces/2.2/vdldocs/facelets/f/ajax.html)。 – mabi

相關問題