【问题标题】:How to re-render <ui:repeat> using <f:ajax render>如何使用 <f:ajax render> 重新渲染 <ui:repeat>
【发布时间】: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 错误?

标签: ajax jsf jsf-2 uirepeat


【解决方案1】:

是的:

【讨论】:

    【解决方案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 属性。这是有道理的,因为它不代表任何东西,它只是一个流控制标签。
    • 好的,所以他需要将它包装在
    猜你喜欢
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 2013-03-25
    • 1970-01-01
    相关资源
    最近更新 更多