我是JSF2和Primefaces的新手,并意识到update
组件的问题。
假设我有下面这段代码,我可以直接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的规则是什么?
在您的第一个示例中,JSF可以在与ajax侦听器相同的作用域中查找计数器元素。表单实现了NamingContainer,这意味着它用自己的id为客户端id(在html中使用)添加前缀,并为id创建一个独特的名称空间。查看浏览器下的页面源代码-将有f1:计数器id分配给您的计数器。在第二个示例中,作用域中没有计数器元素(在表单f2中),因此查找失败。
您可以使用prependId="false"来禁用此表单行为。如果您确定在所有表单中不会有具有相同id的元素,这将非常有用。
Icefaces的工作方式不同-它自动计算html增量并将其作为部分更新发送给浏览器。在大多数情况下,这对程序员来说更方便,但随之而来的是相当大的性能成本。我相信JSF2采用了icefaces部分更新的概念,但要求显式传递id。