2011-09-06 65 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。