【问题标题】:Update a repeater with AJAX in JSF在 JSF 中使用 AJAX 更新中继器
【发布时间】:2012-12-30 01:23:50
【问题描述】:

我正在尝试基于此使用 AJAX 更新中继器列表:How to re-render <ui:repeat> using <f:ajax render>

但是HTML列表在第一次加载后并没有更新,即使ManagedBean中的ArrayList是。

这是我的 xHTML 文件中的内容:

<h:form>
   <h:panelGroup id="messages">
       <a4j:repeat var="mes" value="#{talking.listMessages}">
          <h:outputText value="#{mes.sendTime}">
             <f:convertDateTime type="date" pattern="dd-MM-yyyy HH:mm"/>                                
          </h:outputText>
          #{mes.content}
       </a4j:repeat> 
   </h:panelGroup>
   <a4j:commandLink action="#{talking.testAdd}">
      <h:outputText value="Add Item" />
      <f:ajax execute="@form" render="messages" />
   </a4j:commandLink>
</h:form>

在 MB 中我做了这个简单的动作:

private ArrayList<Message> listMessages;

public void testAdd() {
  this.listMessages.add(new Message(/* [...] */));
}

我错过了什么吗?

【问题讨论】:

  • 尝试用内置的 jsf 和 facelet 替换你的 a4j 标签。我认为ui:repeath:commandLink 会做同样的工作。除此之外,我看不出这里出了什么问题,因为您的案例与引用的案例非常相似。
  • 当你执行 ajax 请求时,还要检查你的 backing bean 没有用初始值重建。

标签: jsf jsf-2 richfaces


【解决方案1】:

查看关于 &lt;a4j:commandLink&gt; 的 RichFaces 文档:

该组件类似于 JavaServer Faces (JSF) 组件,不同之处在于它包含插入式 Ajax 行为。

知道了这一点,问题是&lt;f:ajax&gt; 不适用于&lt;a4j:commandLink&gt;。您应该将代码重写为:

<h:form>
   <h:panelGroup id="messages">
       <a4j:repeat var="mes" value="#{talking.listMessages}">
          <h:outputText value="#{mes.sendTime}">
             <f:convertDateTime type="date" pattern="dd-MM-yyyy HH:mm"/>
          </h:outputText>
          #{mes.content}
       </a4j:repeat>
   </h:panelGroup>
   <a4j:commandLink action="#{talking.testAdd}"
      render="messages">
      <h:outputText value="Add Item" />
   </a4j:commandLink>
</h:form>

另外,请确保您的托管 bean 是 @ViewScoped

【讨论】:

  • 你说得对,我混合了太多的 AJAX 组件。成功了,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多