ui:repeat中p:dataTable中的JSF和p:ajax



我熟悉RichFaces,但对Primefaces相对较新,并试图在p:dataTable内实现简单的h:graphicImage(另外在ui:repeat内)。这是p:ajax在h:graphicImage中的后续问题。

我将拆分以下xhtml代码以直接注释该行为:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.prime.com.tr/ui"
      xml:lang="en" lang="en">
  <h:head id="head">
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Test</title>
  </h:head>
    <h:body id="body">
      <f:view contentType="text/html">

现在第一个h:form紧随其后,其中包含一个h:outputText和一个h:graphicImage。通过单击图像调用bean方法,并正确更新计数器

<h:form id="f1">
  <h:outputText id="counter" value="#{clientBean.counter}" />
  <h:graphicImage url="/images/circle-ok.png">
    <p:ajax event="click" update="counter" process="@this"
            listener="#{clientBean.tag}"/>
  </h:graphicImage> 
</h:form><hr/>

在第二个h:form中,按钮位于p:dataTable内。如果单击图像,则调用bean方法并更新计数器。(一开始我试着update="counter"没有成功)

<h:form id="f2">
  <p:dataTable var="var" value="#{clientBean.vf}">
    <p:column> 
      <f:facet name="header">Tag</f:facet>
      <h:graphicImage url="/images/circle-ok.png">
        <p:ajax event="click" update="f1:counter" process="@this"
                listener="#{clientBean.tag}" />
      </h:graphicImage>
    </p:column>
  </p:dataTable>
</h:form><hr/>

ui:repeated中的图像按预期更新计数器:

<ui:repeat var="var1" value="#{clientBean.list}">   
  <h:form id="f3">
    <h:graphicImage url="/images/circle-ok.png">
  <p:ajax event="click" update="f1:counter" process="@this"
              listener="#{clientBean.tag}" />
    </h:graphicImage> 

现在让我们来看看ui:repeat中的p:dataTable。在这段代码中,bean方法是而不是,调用:

    <p:dataTable var="var2" value="#{var1.list}">
      <p:column>  
        <f:facet name="header">Tag</f:facet>
        <h:graphicImage url="/images/circle-ok.png">
         <p:ajax event="click" update="f1:counter" process="@this"
                 listener="#{clientBean.tag}" />
        </h:graphicImage> 
      </p:column>
    </p:dataTable>
   </h:form>
 </ui:repeat>
</f:view></h:body></html>

在这种情况下,我得到<partial-response><changes><update id="f1:counter">...,但bean方法没有被调用(在它的tag()方法中,计数器没有更新)。这是用调试测试的。我读过无法使用在我的黄金脸'但我对primefaces-3.0.M3.jarprimefaces-2.2.1.jar有相同的行为。

我以前也有过类似的问题。我可能有点偏执,但我的印象是JSF2中的迭代组件UIDataUIRepeat存在bug。特别是当它们被嵌套时,它们将不能正确地处理组件状态。我自己修补了UIRepeat,它适用于任何级别的嵌套。我知道tomahawk的迭代组件也能正常工作。

在您的特殊情况下,一个相当简单的解决方法可能会有所帮助,因为您希望无论单击哪个图像都具有相同的行为。创建一个h:commandLink说在f1的形式与适当的ajax元素内部和id像'update-counter'。隐藏它。将onclick属性添加到值为jsf.ajax.request("f1:update-counter", event, {render: "f1:counter", execute="@this"})的graphicImage。你可能需要用document.getElementById("f1:update-counter")替换第一个参数,我不确定。这个javascript api调用应该等同于点击隐藏的commandLink。或者,您可以尝试跳过commandLink并从f1传递graphicImage id/DOM节点。

我曾经这样做与f:ajax,但也许将工作为p:ajax以及

相关内容

  • 没有找到相关文章

最新更新