JSF и p: ajax внутри p: dataTable внутри ui: repeat - PullRequest
0 голосов
/ 06 сентября 2011

Я знаком с RichFaces, но относительно плохо знаком с Primefaces и пытаюсь реализовать простой h:graphicImage внутри p:dataTable (дополнительно внутри ui:repeat).Это следующий вопрос о p: ajax внутри h: graphicImage .

Я разделю следующий xhtml -код, чтобы напрямую прокомментировать поведение:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.prime.com.tr/ui"
      xml:lang="en" lang="en">
  <h:head id="head">
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Test</title>
  </h:head>
    <h:body id="body">
      <f:view contentType="text/html">

Теперь следует первый h:form, который содержит h:outputText и h:graphicImage.При нажатии на изображение вызывается метод bean, и счетчик корректно обновляется.

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

Во втором h:form кнопка находится внутри p:dataTable.Если я нажимаю на изображение, метод бина называется счетчик обновляется.( Примечание Сначала я попытался 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><hr/>

Изображение внутри ui:repeated обновляет счетчик , как и ожидалось:

<ui:repeat var="var1" value="#{clientBean.list}">   
  <h:form id="f3">
    <h:graphicImage url="/images/circle-ok.png">
  <p:ajax event="click" update="f1:counter" process="@this"
              listener="#{clientBean.tag}" />
    </h:graphicImage> 

Теперь давайте перейдем к p:dataTable внутри ui:repeat.С этим фрагментом кода метод бина не называется:

    <p:dataTable var="var2" value="#{var1.list}">
      <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>
 </ui:repeat>
</f:view></h:body></html>

В этом случае я получаю <partial-response><changes><update id="f1:counter">..., но метод бина не вызывается (внутри это tag() метод счетчик не обновляется).Это проверено с отладкой.Я прочитал невозможно использоватьна данных моего простого лица , но у меня такое же поведение с primefaces-3.0.M3.jar и primefaces-2.2.1.jar.

1 Ответ

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

Раньше у меня была похожая проблема.Я могу быть параноиком, но у меня сложилось впечатление, что итеративный компонент UIData и UIRepeat в JSF2 содержат ошибки.В частности, они не будут правильно обрабатывать состояние компонента, когда они вложены.Я сам исправил UIRepeat, и он работает для меня с любым уровнем вложенности.Я знаю, что итеративный компонент из томагавка также работает правильно.

В вашем конкретном случае может помочь достаточно простой обходной путь, поскольку вы хотите, чтобы одно и то же поведение выполнялось независимо от того, какое изображение нажималось.Создайте h:commandLink скажем в форме f1 с соответствующим элементом ajax внутри и идентификатором типа «update-counter».Скрыть.Добавьте атрибут onclick к вашему графическому изображению со значением jsf.ajax.request("f1:update-counter", event, {render: "f1:counter", execute="@this"}).Возможно, вам придется заменить первый аргумент на document.getElementById("f1:update-counter"), я не уверен.Этот вызов API javascript должен быть эквивалентен нажатию скрытой commandLink.В качестве альтернативы вы можете попытаться пропустить commandLink и передать вместо него узел graphicImage id / DOM из f1.

Раньше я делал это с f:ajax, но, возможно, будет работать и с p:ajax.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...