2011-09-06 60 views
0

我熟悉RichFaces,但对Primefaces相对较新,并试图在p:dataTable(另外在ui:repeat内)实现简单的h:graphicImage。这是接下来的问题p:ajax inside h:graphicImageJSF和p:ajax里面p:数据表里面ui:重复

我会分裂以下xhtml -code直接发表评论的行为:

<!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:outputTexth: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方法被称为计数器更新。 (注意在firt我试图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> 

现在让我们走到了p:dataTable一个ui:repeat内。有了这段代码的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()方法计数器未更新)。这通过调试进行测试。 我读过 unable to use <p:ajax> on my primeface's datatable 但我的行为与primefaces-3.0.M3.jarprimefaces-2.2.1.jar相同。

回答

4

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

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

我以前用f:ajax来做到这一点,但也许也可以用于p:ajax

+0

感谢您的解决方法的建议。实际上,我不想要相同的行为,我只是用这种方式来描述它,以便用_simple_示例来说明问题。但是,处理组件的错误的JSF2的印象是为什么bean没有被调用? – Thor

+0

状态保存问题与UIData/UIRepeat在处理后没有清理客户端ID相关。这导致状态被保存在具有迭代索引的键下,并且它们不会与恢复的组件ID相匹配。结果嵌套迭代器的状态丢失了。这里是另一个解决方案:使用c:forEach代替周围的ui:重复,所以没有迭代组件嵌套。 – mrembisz

+0

我不确定在JSF中使用JSTL标记是否合适,Web上充满了讨论。虽然它使用'c:foreach',但我有副作用,对于每个AJAX请求,我的@ ViewScoped' bean的'@ PostConstruct'方法被调用,导致性能很差。 – Thor