Ajax按钮并在Primefaces datascroller中渲染?

时间:2015-02-23 16:12:54

标签: ajax jsf primefaces

我正在使用Primefaces [<p:dataScroller />][2]来显示延迟加载项的列表。我的JSF代码看起来像这样:

<p:dataScroller id="scroller" value="#{myAction.myDataModel}" var="item" lazy="true" chunkSize="10">
  <section>
    <h3>Here is my item : <h:outputText value="#{item.name}" /></h3>
  </section>
</p:dataScroller>

此代码没有问题。我的支持代码能够根据需要从数据库中延迟加载项目,而不是一次性将它们全部拉出并在客户端进行分页。但是,现在我想在datascroller中添加<h:commandLink />并执行Ajax提交,但只重新呈现被单击的项目。我的后备操作将更新我的项目的状态,我会根据此状态显示不同的消息。我以为我可以这样做:

<p:dataScroller id="scroller" value="#{myAction.myDataModel}" var="item" lazy="true" chunkSize="10">
  <section>
    <h:panelGroup id="#{item.name}" layout="block">
        <h3>Here is my item : <h:outputText value="#{item.name}" /></h3>
        <h:commandLink action="#{myAction.foo()}" value="Click here">
           <f:ajax render="#{item.name}" />
        </h:commandLink
    </h:panelGroup>
  </section>
</p:dataScroller>

...但是,我现在知道我在JSF中没有动态ID,因此我<h:panelGroup />的渲染失败了。我可以将render属性值<f:ajax />设置为我的JSF表单,但是从头开始重新呈现所有内容,这不是所需的行为。

如果我的<p:dataScroller />中显示了100个项目,并且我点击项目30上的链接,是否有任何方法只能渲染该项目?有没有更好的方法来处理这个用例?还是我完全卡住了?

1 个答案:

答案 0 :(得分:1)

您不需要动态ID。您可以使用专为此类案例设计的PrimeFaces selectors。因此,您可以按类或其他方式引用父母,项目。完整jquery selector api随时为您服务非常灵活!只是不确定它是否适用于h:commandButton和f:ajax(可能是h:commandButton和p:ajax工作)。但可以肯定的是

<p:commandButton update="@(:parent)" value="update parent" />