2011-09-06 66 views
0

我是JSF2和Primefaces的新手,並意識到update組件的問題。ID更新組件的規則

讓假設我有以下一段代碼,我可以直接update="counter"

<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> 

在另一個h:form我必須使用update="f1:counter"。只有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> 

我還沒有面對這與JSF1.2(和RichFaces),有什麼規則來正確解決id?

回答

2

在您的第一個示例中,JSF可以在與ajax偵聽器相同的作用域中查找counter元素。表單實現NamingContainer,這意味着它使用自己的id前綴客戶端id(在html中使用),併爲id創建一個獨特的名稱空間。查看瀏覽器下的頁面源代碼 - 將會有f1:counter id分配給您的計數器。在第二個示例中,範圍中沒有計數器元素(在表格f2內),因此查找失敗。

您可以使用prependId =「false」來禁用此表單行爲。如果您確定在所有表單中不存在具有相同ID的元素,這很有用。

Icefaces的工作方式不同 - 它會自動計算html delta並將其作爲部分更新發送到瀏覽器。在大多數情況下,這對程序員來說更方便,但是會帶來相當大的性能成本。我相信JSF2採用了icefaces部分更新的概念,但需要直接傳遞id。