【问题标题】:How to render one panel and stop rendering another panel using selectOneMenu in jsf如何在jsf中使用selectOneMenu渲染一个面板并停止渲染另一个面板
【发布时间】:2014-03-06 12:45:48
【问题描述】:

我有以下代码:

<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”面板时,我不想呈现此面板。有没有办法做到这一点。

谢谢

【问题讨论】:

  • 请给出完整代码,以便于理解。
  • 代码已编辑。完整的代码在那里。 @Bhola。

标签: jsf richfaces selectonemenu


【解决方案1】:

将您的面板包装在一个更宽的容器中,然后将其指向您的 &lt;h:selectOneMenu /&gt;。然后,根据#{SystemHealthPageModel.selectedSensorId} 值执行&lt;rich:panel /&gt; 元素的条件渲染。

<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>

【讨论】:

    【解决方案2】:

    我们将使用监听器方法然后重新渲染组件来实现这一点。

    (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- 在您的托管 bean 中,您将创建一个切换标志,我们称之为showAllSystem,如果它是true,它将显示allSystemHealthAlert 并隐藏systemHealthAlert。该标志将被面板的rendered 属性使用。

    3- 然后您将创建侦听器方法,我们称之为menuValueChanged(),它将根据selectedSensorId 设置showAllSystem 标志,并将由您的a4j:ajax 标记中的侦听器调用

    【讨论】:

    • 1) 您的侦听器定义缺少(),它们在您的方法定义中不是可选的。 2)您需要重新渲染页面上存在的id(参见@XtremeBiker的方法),否则JSF在响应返回时找不到重新渲染的目标。
    • 数字 (1) 是完全不正确的,在 EL 中,如果我们没有将参数传递给它docs.oracle.com/javaee/7/tutorial/doc/jsf-el003.htm#BNAHZ,我们可以调用不带括号的方法,我会通过写 100 来惩罚自己的数字 (2)次:encapsulate the to-be-rendered-using-ajax component with an ALWAYS rendered component .. 我会编辑我的答案。干杯!
    • 你试过(1)吗?如果有效,请告诉我。我的理解是,只有在预期的方法签名不带参数时才允许关闭括号。 listener 方法 takeAjaxBehaviorEvent
    • 是的,它有效。实际上,当您不指定事件时,它会采用 UIComponent 的默认事件(例如 inputText 的 onchange 和 selectOneMenu 的 valuechange)
    猜你喜欢
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多