Правила для идентификаторов для обновления компонентов - PullRequest
0 голосов
/ 06 сентября 2011

Я новичок в 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), каковы правила для правильной работы с идентификаторами?

1 Ответ

2 голосов
/ 06 сентября 2011

В вашем первом примере JSF может искать элемент counter в той же области, что и слушатель ajax. Форма реализует NamingContainer, что означает, что он добавляет к своим идентификаторам клиентские идентификаторы (используемые в html) и создает отдельное пространство имен для идентификаторов. Взгляните на источник страницы в браузере - для вашего счетчика будет назначен идентификатор f1: counter. Во втором примере элемент контекста отсутствует в области видимости (внутри формы f2), поэтому поиск не выполняется.

Вы можете отключить это поведение формы с помощью prependId = "false". Это полезно, если вы уверены, что во всех формах не будет элементов с одинаковыми идентификаторами.

Icefaces работает по-другому - он автоматически вычисляет html-дельту и отправляет ее в браузер как частичное обновление. В большинстве случаев это более удобно для программиста, но требует значительных затрат на производительность. Я считаю, что JSF2 принял концепцию частичного обновления icefaces, но требует, чтобы идентификаторы передавались явно.

...