我熟悉RichFaces,但對Primefaces相對較新,並試圖在p:dataTable
(另外在ui:repeat
內)實現簡單的h:graphicImage
。這是接下來的問題p:ajax inside h:graphicImage。JSF和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: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方法被稱爲計數器更新。 (注意在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.jar
和primefaces-2.2.1.jar
相同。
感謝您的解決方法的建議。實際上,我不想要相同的行爲,我只是用這種方式來描述它,以便用_simple_示例來說明問題。但是,處理組件的錯誤的JSF2的印象是爲什麼bean沒有被調用? – Thor
狀態保存問題與UIData/UIRepeat在處理後沒有清理客戶端ID相關。這導致狀態被保存在具有迭代索引的鍵下,並且它們不會與恢復的組件ID相匹配。結果嵌套迭代器的狀態丟失了。這裏是另一個解決方案:使用c:forEach代替周圍的ui:重複,所以沒有迭代組件嵌套。 – mrembisz
我不確定在JSF中使用JSTL標記是否合適,Web上充滿了討論。雖然它使用'c:foreach',但我有副作用,對於每個AJAX請求,我的@ ViewScoped' bean的'@ PostConstruct'方法被調用,導致性能很差。 – Thor