如何使用 <f:ajax render> 重新渲染 <ui:repeat>
Posted
技术标签:
【中文标题】如何使用 <f:ajax render> 重新渲染 <ui:repeat>【英文标题】:How to re-render <ui:repeat> using <f:ajax render> 【发布时间】:2011-04-02 15:11:11 【问题描述】:我已经实现了一个由中继器创建的列表:
<ui:repeat value="#projectData.paginator.list" var="project">
<h:outputText value="#project.title" />
</ui:repeat>
还有一个过滤我的列表的按钮:
<h:commandLink action="#overviewController.filterNew">
<h:outputText value="Filter List" />
</h:commandLink>
那么,有没有一种简单的方法可以在单击命令链接(使用 AJAX)后仅渲染我的转发器 :-)
我尝试了以下操作:
<f:ajax render="repeater">
ui:repeat id="repeater" value="#projectData.paginator.list" var="project">
<h:outputText value="#project.title" />
</ui:repeat>
<f:ajax />
<h:commandLink action="#overviewController.filterNew">
<h:outputText value="Filter List" />
<f:ajax event="click" render="repeater"/>
</h:commandLink>
但这没有用..
更新
<h:form>
ui:repeat id="repeater" value="#projectData.paginator.list" var="project">
<h:outputText value="#project.title" />
</ui:repeat>
<h:commandLink action="#overviewController.filterNew">
<h:outputText value="Filter List" />
<f:ajax event="click" render="repeater"/>
</h:commandLink>
</h:form>
也不起作用...也许我必须将操作方法(overviewController.filterNew)放入 ajax 标记中?
更新 2
<f:ajax event="click" render="repeater">
<h:commandLink action="#overviewController.filterEBus">
<h:outputText value="EBusiness" />
</h:commandLink>
</f:ajax>
也不行!
也许无法重新渲染中继器?是否还有其他元素,例如 div 标签或可以重新渲染的东西???
...
感谢您的帮助
【问题讨论】:
也许我必须将操作方法 (overviewController.filterNew) 放入 ajax 标记中? - 试试看,为什么不呢? 也不行!如果没有人看到错误,可能存在 jsf/ajax 错误? 【参考方案1】:是的:
使用 Richfaces<a4j:commandButton reRender="targetId" />
使用 JSF 2.0 <f:ajax event="click" render="targetId">
使用 Primefaces <p:ajax>
【讨论】:
【参考方案2】:<f:ajax render="repeater">
ui:repeat id="repeater" value="#projectData.paginator.list" var="project">
<h:outputText value="#project.title" />
</ui:repeat>
<f:ajax />
你为什么用 f:ajax 包装它?在这种情况下是多余的。
确保你的组件被<h:form>
标签包围
<h:form>
<ui:repeat id="repeater" value="#projectData.paginator.list" var="project">
<h:outputText value="#project.title" />
</ui:repeat>
<h:commandLink action="#overviewController.filterNew">
<h:outputText value="Filter List" />
<f:ajax event="click" render="repeater"/>
</h:commandLink>
</h:form>
【讨论】:
我也尝试过。我用 h:form 标签包围了整个部分 :-( 它什么也没死-.-【参考方案3】:<ui:repeat>
本身不会为输出生成任何 html。 <f:ajax render>
需要一个存在于 HTML DOM 树中的 ID。将其放在带有id
的<h:panelGroup>
中,然后引用它。
<h:form>
<h:panelGroup id="projects">
<ui:repeat value="#projectData.paginator.list" var="project">
<h:outputText value="#project.title" />
</ui:repeat>
</h:panelGroup>
<h:commandLink action="#overviewController.filterNew">
<h:outputText value="Filter List" />
<f:ajax execute="@form" render="projects" />
</h:commandLink>
</h:form>
【讨论】:
但对我来说,这似乎在验证异常的情况下不起作用。在这种情况下,我的数据丢失了。【参考方案4】:这个怎么样:
<ui:repeat id="repeater" value="#projectData.paginator.list" var="project">
<h:outputText value="#project.title" />
</ui:repeat>
<h:commandLink>
<h:outputText value="Filter List" />
<f:ajax render="repeater" listener="#overviewController.filterNew" />
</h:commandLink>
【讨论】:
ui:repeat
不支持 id
属性。这是有道理的,因为它不代表任何东西,它只是一个流控制标签。
好的,所以他需要将它包装在 以上是关于如何使用 <f:ajax render> 重新渲染 <ui:repeat>的主要内容,如果未能解决你的问题,请参考以下文章
JSF f:ajax 监听器 vs commandButton 动作
Rendering table h:dataTable with f:ajax when select h:selectOneMenu confuses f:validateLength