如何使用 <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 &lt;a4j:commandButton reRender="targetId" /&gt; 使用 JSF 2.0 &lt;f:ajax event="click" render="targetId"&gt; 使用 Primefaces &lt;p:ajax&gt;

【讨论】:

【参考方案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 包装它?在这种情况下是多余的。

确保你的组件被&lt;h:form&gt;标签包围

<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】:

&lt;ui:repeat&gt; 本身不会为输出生成任何 html&lt;f:ajax render&gt; 需要一个存在于 HTML DOM 树中的 ID。将其放在带有id&lt;h:panelGroup&gt; 中,然后引用它。

<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>的主要内容,如果未能解决你的问题,请参考以下文章

使用 f:ajax 渲染多个组件

JSF f:ajax 监听器 vs commandButton 动作

Rendering table h:dataTable with f:ajax when select h:selectOneMenu confuses f:validateLength

JSF 自定义组件:如何获取 <f:ajax /> 的属性

何时使用 valueChangeListener 或 f:ajax 监听器?

如何在 h:inputText 中将参数传递给 f:ajax? f:参数不起作用