0

我正在尝试基于此使用 AJAX 更新转发器列表:如何使用 <f:ajax render> 重新渲染 <ui:repeat>

但是 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(/* [...] */));
}

我错过了什么 ?

4

1 回答 1

2

检查 RichFaces 文档<a4j:commandLink>

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

知道了这一点,问题在于它<f:ajax>不适用于<a4j:commandLink>. 您应该将代码重写为:

<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.

于 2013-01-15T22:35:22.003 回答