使用Ajax仅更新ui:repeat而不是所有表单

时间:2015-10-14 14:33:13

标签: ajax jsf render uirepeat

我在应用程序中渲染某些数据时遇到了一些问题。 为了简单起见,我有一个h:表单,其中包含一个带有ui的表:在tbody中重复。让我们做一个例子(我没有把所有代码都放,因为它太长了):

<h:form id="sequence-assemblage-form">
    <ui:fragment>
        <table id="table-fils">
            <thead>
                ...
            </thead>
            <tbody>
                <ui:repeat id="fil">
                    <tr>
                        many <td> one after another
                        <ui:fragment>
                            <td>
                                <h:panelGroup id="actionsEditing" rendered="">
                                                        <h:inputHidden id="filHarnaisId" value="#{fil.id}"/>

                                                        <h:commandLink styleClass="icon-20 icon-save" id="save">
                                                            <f:ajax execute="@form" render="" listener="doesAnAction"/>
                                                            <f:ajax execute="@form" render="@form" listener="doesAnotherAction"/>
                                                            <f:ajax execute="@form" render=":integrite-form :message-integrite-panel" onevent="verifierIntegrite"/>
                                                        </h:commandLink>
                                                        <h:commandLink styleClass="icon-20 icon-rollback" id="rollback" action="">
                                                            <f:ajax execute="@this" render="@form" />
                                                        </h:commandLink>
                                                    </h:panelGroup>
                            </td>
                        </ui:fragment>
                    </tr>
                </ui:repeat>
            </tbody>
        </table>
    </ui:fragment>
</h:form>

我的问题是,每次保存时,它都会以完整的方式呈现表单,当我的表包含许多行时会导致性能问题(你知道,当你每次保存时,页面花了10秒多的时间加载吗?)。有没有办法这样做只会渲染我正在编辑的行?

我不知道问题是与f:ajax execute还是f:ajax render有关,但我需要找出问题所在并找到性能解决方案。

祝你有个愉快的一天 谢谢!

编辑: 我注意到在尝试找到一个解决方案时,其中一个侦听器更改了我的bean中的值,并且需要此值来呈现一个重要的脚本来触发保存(参见下文)

<h:outputScript rendered="#{fil.modifie}">
    showNoticeChangementDialog();
</h:outputScript>

这些代码行在ui:repeat结尾之前,这意味着只更新ui:repeat,如果我的值被修改了,它应该触发对话框吗?

我尝试使用我的render的ID更改executeui:repeat,但它无效。

1 个答案:

答案 0 :(得分:0)

我设法在同事和particular answer的帮助下找到了解决方法。

必须将<td>内的每个h:panelGroup的内容打包并为其提供唯一ID。然后,我可以在每个元素上使用render以确保它们已更新。

看起来像这样:<f:ajax render="id1 id2 id3 id4 ..."