0

我正在使用 PrimeFaces 3.5,但我遇到了部分页面渲染的问题。我需要将 Facelet 文件中的内容加载到模板的“动态”部分。

index.xhtml

<f:view> 
    <h:form id="form1">
        <p:outputPanel layout="block">
            <p:commandButton action="content-2?faces-redirect=false" update="display" />
        </p:outputPanel>
        <p:outputPanel id="display" layout="block">
            content 1
        </p:outputPanel>
    </h:form>
</f:view>

content-2.xhtml

<h:body>
    content 2 loaded
</h:body>

当我点击<p:commandButton>,然后content-2.xhtml将被打开。但是,这会刷新整个页面。XML 响应包含如下内容:

<partial-response><changes><update id="javax.faces.ViewRoot">

当我将action属性更改为方法表达式时:

<f:view> 
    <h:form id="form1">
        <p:outputPanel layout="block">
            <p:commandButton action="#{myBean.increment}" update="display" />
        </p:outputPanel>
        <p:outputPanel id="display" layout="block">
            #{myBean.count}
        </p:outputPanel>
    </h:form>
</f:view>

然后display块按预期更新。XML 响应包含如下内容:

<partial-response><changes><update id="form:display">

为什么action="content-2?faces-redirect=false"更新整个页面的方式?

我也尝试过<ui:composition>,但在这种情况下,这会重新加载模板的“静态”部分。我不想要这个。

4

1 回答 1

0

如果您通过在属性中提供非结果导航到不同的视图,这是完全正常和预期的行为。然后 JSF 将使用. JSF/Facelets 不会像您预期的那样以某种方式自动保留树中的公共组件。如果您打算在部分页面渲染期间动态更改组件树,那么您需要在其中一个动态包含类似这样的内容(只是一个整数)nullaction@all<p:outputPanel id="display" layout="block">section

<ui:include src="section#{bean.section}.xhtml" />

或多个有条件渲染的部分

<ui:fragment rendered="#{bean.section == 1}"><ui:include src="section1.xhtml" /></ui:fragment>
<ui:fragment rendered="#{bean.section == 2}"><ui:include src="section2.xhtml" /></ui:fragment>
<ui:fragment rendered="#{bean.section == 3}"><ui:include src="section3.xhtml" /></ui:fragment>
<ui:fragment rendered="#{bean.section == 4}"><ui:include src="section4.xhtml" /></ui:fragment>

根据包含文件是否包含表单/输入/命令组件和/或引用视图范围的 bean,每个都有自己的优缺点。即在<ui:include>视图构建期间运行,如 JSTL。另请参阅 JSF2 Facelets 中的 JSTL 以获取更多详细信息……有意义吗?

的存在faces-redirect=false并不重要,因为它已经是默认设置。如果是,那么将在目标 URL 上调用trueJavaScript 。window.location

于 2013-04-11T17:33:53.223 回答