使用 Ajax 仅更新 ui:repeat 而不是所有表格
Use Ajax to update only ui:repeat instead of all form
我在应用程序中呈现某些数据时遇到问题。
为简单起见,我有一个 h:form,其中包含 table 和 tbody 中的 ui:repeat。让我们举个例子(我没有放所有代码,因为它太长了):
<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>
我的问题是,每次我保存时,它都会完整地呈现表单,当我的 table 包含很多行时会导致性能问题(你知道,当一个页面每次加载大约 10 秒时您保存?)。有没有办法做到这一点,它只会呈现我当前正在编辑的行?
我不知道问题出在 f:ajax execute
还是 f:ajax render
但我需要弄清楚问题出在哪里并找到性能解决方案。
祝你有愉快的一天
谢谢!
编辑:
我在尝试找到一种解决方案时注意到,其中一个侦听器更改了我的 bean 中的一个值,并且需要此值来呈现一个对触发保存很重要的脚本(见下文)
<h:outputScript rendered="#{fil.modifie}">
showNoticeChangementDialog();
</h:outputScript>
这些代码行就在我的 ui:repeat
结束之前,这意味着通过仅更新 ui:repeat
,如果我的值已被修改,它应该触发对话框?
我尝试用我的 ui:repeat
的 ID 更改 render
和 execute
,但没有成功。
在一位同事的帮助下,我设法找到了解决方法,这 particular answer。
必须将每个 <td>
的内容包装在 h:panelGroup
中,并给它们一个唯一的 ID。然后我可以在每个元素上使用 render
来确保它们已更新。
看起来像这样:<f:ajax render="id1 id2 id3 id4 ..."
我在应用程序中呈现某些数据时遇到问题。 为简单起见,我有一个 h:form,其中包含 table 和 tbody 中的 ui:repeat。让我们举个例子(我没有放所有代码,因为它太长了):
<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>
我的问题是,每次我保存时,它都会完整地呈现表单,当我的 table 包含很多行时会导致性能问题(你知道,当一个页面每次加载大约 10 秒时您保存?)。有没有办法做到这一点,它只会呈现我当前正在编辑的行?
我不知道问题出在 f:ajax execute
还是 f:ajax render
但我需要弄清楚问题出在哪里并找到性能解决方案。
祝你有愉快的一天 谢谢!
编辑: 我在尝试找到一种解决方案时注意到,其中一个侦听器更改了我的 bean 中的一个值,并且需要此值来呈现一个对触发保存很重要的脚本(见下文)
<h:outputScript rendered="#{fil.modifie}">
showNoticeChangementDialog();
</h:outputScript>
这些代码行就在我的 ui:repeat
结束之前,这意味着通过仅更新 ui:repeat
,如果我的值已被修改,它应该触发对话框?
我尝试用我的 ui:repeat
的 ID 更改 render
和 execute
,但没有成功。
在一位同事的帮助下,我设法找到了解决方法,这 particular answer。
必须将每个 <td>
的内容包装在 h:panelGroup
中,并给它们一个唯一的 ID。然后我可以在每个元素上使用 render
来确保它们已更新。
看起来像这样:<f:ajax render="id1 id2 id3 id4 ..."