2011-09-06 29 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