java - 在 Primefaces5+JSF2 中渲染不工作

标签 java jsf primefaces

这是我的 XHTML 代码

<p:selectOneRadio id="selectone"
                    value="#{tweetDistributionManagedBean.tweetType}">
                    <f:selectItem itemLabel="Group Tweets" itemValue="GT" />
                    <f:selectItem itemLabel="Event Tweets" itemValue="ET" />
                    <f:selectItem itemLabel="Suprachar Tweets" itemValue="ST" />
                    <p:ajax event="click"
                        listener="#{tweetDistributionManagedBean.renderUploadPanel}"
                        update="gtid" process="@form" />
                </p:selectOneRadio>

和我正在调用的Java方法

public void renderUploadPanel(AjaxBehaviorEvent event) {
       // String selecteValues = (String) event. ;
        visibleGTFlag = true;
        System.out.println("Method called----------->"+visibleGTFlag);
    }

我想在单击复选框时渲染此面板

<p:panel id="gtid"
                rendered="#{tweetDistributionManagedBean.visibleGTFlag}"
                toggleable="true">
                <p:fileUpload
                    fileUploadListener="#{tweetDistributionManagedBean.handleFileUpload}"
                    mode="advanced" multiple="true" update="messages" auto="true"
                    sizeLimit="1048576" allowTypes="/(\.|\/)(doc|docx|xls|xlsx|pdf)$/" />
            </p:panel>

但是当我刷新此页面时,此面板呈现我做错了什么?

最佳答案

问题是当组件有rendered="false"时它不会被添加到 View 树组件中,因此它不能被当前 View 中的任何组件引用或更新。这解释了为什么当您尝试通过 ajax 请求更新组件时此更新会失败,因为您仍然处于同一 View 中,而当您在页面上触发完整请求时,您可以看到该组件,因为它是一个新 View .

这些问题的解决方案是将非渲染组件包装在 UIContainer 内,并更新包装组件。您可以使用<h:panelGroup layout="block">将呈现为 HTML div:

<p:selectOneRadio id="selectone"
    value="#{tweetDistributionManagedBean.tweetType}">
    <f:selectItem itemLabel="Group Tweets" itemValue="GT" />
    <f:selectItem itemLabel="Event Tweets" itemValue="ET" />
    <f:selectItem itemLabel="Suprachar Tweets" itemValue="ST" />
    <p:ajax event="click"
        listener="#{tweetDistributionManagedBean.renderUploadPanel}"
        update="gtidWrapper" process="@form" />
</p:selectOneRadio>

<!-- rest of Facelets code... -->

<h:panelGrid id="gtidWrapper" layout="block">
    <p:panel id="gtid"
        rendered="#{tweetDistributionManagedBean.visibleGTFlag}"
        toggleable="true">
        <p:fileUpload
            fileUploadListener="#{tweetDistributionManagedBean.handleFileUpload}"
            mode="advanced" multiple="true" update="messages" auto="true"
            sizeLimit="1048576" allowTypes="/(\.|\/)(doc|docx|xls|xlsx|pdf)$/" />
    </p:panel>
</h:panelGrid>

关于java - 在 Primefaces5+JSF2 中渲染不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24370801/

相关文章:

java - 将字母数字字符串转换为整数?

mysql - 我们可以在 JSF 应用程序中将 Hibernate Search 与 MySQL 5.1 InnoDB 一起使用吗

jsf - 不要重新显示 <p :messages autoUpdate ="true"> 中对话框中已经显示的消息

jsf-2 - 无法动态设置组件标识符

java - AlarmManager 无需等待指定时间即可触发 Intent

java - 在 Tapestry 5 Web 应用程序中编辑复杂的 Java 对象

java - Tomcat 7/Tomee/Java 数据源

java - 关于 JSF2 托管 Bean 作用域机制(请求作用域)的 Web 应用程序设计问题

jsf - <h :commandLink> not working inside a <h:dataTable>