如何使用p:ajax按顺序更新多个组件

时间:2013-03-18 22:27:57

标签: ajax jsf jsf-2 primefaces

我正在尝试呈现以下JSF页面:

<h:form id="form" prependId="false">
    <h:panelGrid width="100%">
        <h:panelGroup id="tableDiv" layout="block">
            <h:panelGroup layout="block" style="text-align: center;">
                <p:dataTable id="table" var="_item" 
                        value="#{primeBean.findTableModel()}">
                        ...
                </p:dataTable>
            </h:panelGroup>
        </h:panelGroup>
        <h:panelGrid columns="2" width="100%">
            <h:panelGroup id="barChartDiv" layout="block">
                <p:barChart id="barChart"
                    value="#{primeBean.findCartesianModel()}">
                    <p:ajax event="itemSelect" listener="#{primeBean.handleItemSelect}"
                            update="pieChartDiv,tableDiv" />
                </p:barChart>
            </h:panelGroup>
            <h:panelGroup id="pieChartDiv" layout="block">
                <h:panelGroup layout="block">
                    <p:pieChart id="pieChart">
                        <p:ajax event="itemSelect" listener="#{primeBean.handleItemSelect}" 
                                update="tableDiv" />
                    </p:pieChart>
                </h:panelGroup>
            </h:panelGroup>
        </h:panelGrid>
    </h:panelGrid>
</h:form>

当我点击p:barChart上的任何栏时,我希望更新属性中的组件将按照我声明(pieChartDiv,tableDiv)的顺序呈现,但它们以相反的顺序呈现{{1 }}

这是正常行为吗?如何按声明项目的顺序更新组件列表?

3 个答案:

答案 0 :(得分:10)

这种方式不可能。搜索和更新组件的顺序与JSF组件树中显示的顺序完全相同。

一种方法是重新排列/交换树层次结构中的两个组件,并借助CSS在视觉上重新定位它们。然而,这是相当笨拙的。

另一种方法是在完成第一个组件的更新时更新第二个组件(因此有效地结束了2个ajax请求而不是1个)。您可以在<p:remoteCommand>的帮助下实现这一目标,该{{3}}会在完成<p:ajax>时调用。

所以,而不是

<p:ajax ... update="pieChartDiv,tableDiv" />

使用

<p:ajax ... update="pieChartDiv" oncomplete="updateTableDiv()" />
...
<p:remoteCommand name="updateTableDiv" update="tableDiv" />

答案 1 :(得分:1)

从我所看到的......您声明组件的顺序如下:

<h:panelGroup id="tableDiv" layout="block"> (1º component)
            ...
        </h:panelGroup>
        <h:panelGrid columns="2" width="100%">(2º component)
            <h:panelGroup id="barChartDiv" layout="block">
                ...
            </h:panelGroup>
            <h:panelGroup id="pieChartDiv" layout="block">

            </h:panelGroup>
        </h:panelGrid>
    </h:panelGrid>

“barChartDiv”和“pieChartDiv”都是第二个组件

答案 2 :(得分:1)

不是那么优雅,但工作解决方案可以是这样的:

<p:barChart id="barChart" 
    value="#{primeBean.findCartesianModel()}">
    <p:ajax event="itemSelect" listener="#{primeBean.handleItemSelect}" 
        update="pieChartDiv" /> <!-- This will be updated as first. -->
    <p:ajax event="itemSelect" 
        update="tableDiv" /> <!-- And this will be updated as second. -->
</p:barChart>