用于更新组件的ID的规则

时间:2011-09-06 07:49:37

标签: java jsf jsf-2 primefaces

我是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的规则是什么?

1 个答案:

答案 0 :(得分:2)

在您的第一个示例中,JSF可以在与ajax侦听器相同的范围内查找counter元素。 Form实现了NamingContainer,这意味着它为客户端id(在html中使用)添加了自己的id前缀,并为id创建了一个独特的名称空间。看一下浏览器下的页面源代码 - 将为您的计数器分配f1:counter id。在第二个示例中,范围中没有计数器元素(在表单f2中),因此查找失败。

您可以使用prependId =“false”禁用此表单行为。如果您确定所有表单中不存在具有相同ID的元素,则此功能非常有用。

Icefaces的工作方式不同 - 它会自动计算html增量并将其作为部分更新发送到浏览器。在大多数情况下,这对程序员来说更方便,但性能成本相当高。我相信JSF2采用了icefaces部分更新概念,但要求ids明确地传递。