p:ajax внутри h:graphicImage

У меня проблема с запуском запроса ajax с Primefaces

<f:metadata>
  <f:viewParam name="token" value="#{clientBean.token}"/>
  <f:event type="preRenderView" listener="#{clientBean.getParameter}" />
</f:metadata>
<h:form>
  <h:graphicImage id="id1" url="/images/circle-ok.png" onclick="dTag.show();"/>
  <p:commandButton id="id4" value="T" actionListener="#{clientBean.tag}" />  

  <!-- This does not work -->
  <h:graphicImage id="id2" url="/images/circle-ok.png">
    <p:ajax id="id3" event="onclick" onstart="dTag.show();"
            actionListener="#{clientBean.tag}" />
  </h:graphicImage>
</h:form>

Первый h:graphicImage правильно открывает диалог, p:commandButton правильно запускает actionListener, но p:ajax не имеет никакого эффекта (проверено на движке приложения Google).

Обновление 1 Изменение event с onclick на click было абсолютно правильным (спасибо BalusC): теперь отображается p:dialog. Но все же метод tag() не вызывается. Я обновил xhtml-Code на f:metadata, потому что есть одно дополнительное ведение журнала. Я думаю, что это связано с p:ajax и вызовом bean-компонента, я пробовал actionListener, action и listener (из документации Primefaces) с тем же результатом:

  • Механизмы приложения регистрируют вызов getParameter(ComponentSystemEvent event), а Firebug показывает это частичное обновление: <changes><update id="otCounter"><![CDATA[<span id="otCounter">0</span>]]></update>..
  • Вызов public void tag(ActionEvent ae) не регистрируется (также пробовал public void tag())

p:commandButton корректно обновляет счетчик.

Обновление 2 Я удалил f:viewParam и f:event для простоты и теперь использую listener и public void tag(), но метод не вызывается :-(

Обновление 3 Ответ BalusC правильный, у меня есть другие проблемы при его использовании здесь: JSF и p:ajax внутри p :dataTable внутри ui:repeat


person Thor    schedule 05.09.2011    source источник


Ответы (1)


Неверное имя события, оно должно быть "click" без префикса on.

<h:graphicImage id="id2" url="/images/circle-ok.png">
    <p:ajax id="id3" event="click" onstart="dTag.show();"
        listener="#{clientBean.tag}" />
</h:graphicImage>

Префикс событий on применяется только к именам атрибутов элемента HTML, которые обеспечивают перехватчик для обработчика событий. Они не представляют полные имена событий.

Обратите внимание, что <p:ajax> не поддерживает атрибут actionListener. Он должен быть listener и должен ссылаться на метод, который принимает AjaxBehaviourEvent в качестве аргумента (без аргументов тоже все в порядке). Это точно так же, как и на <f:ajax>.

person BalusC    schedule 05.09.2011
comment
Спасибо BalusC, теперь отображается диалоговое окно, но мой метод компонента не вызывается. (я обновил вопрос) - person Thor; 05.09.2011
comment
См. обновление ответа, actionListener не поддерживается <p:ajax>. Извините, я не сразу это увидел, так как не знаю всего PF vdl с головы до ног и предположил, что вы правы в этом. - person BalusC; 05.09.2011
comment
Спасибо за обновление, но эта проблема все еще сводит меня с ума. Я еще раз явно протестировал listener и метод public void tag(), но метод не вызывается :-( - person Thor; 05.09.2011
comment
Вы уверены, что это было помещено в <h:form>? Что, если вместо этого использовать <f:ajax>? (только удалите это onstart для теста). - person BalusC; 05.09.2011
comment
Да, внутри h:form. Но дополнительно внутри ui:repeat (где работает как шарм) и p:datatable. Я думаю, что видел другие связанные проблемы с запросами «p: datatable» и ajax и буду искать их! - person Thor; 06.09.2011
comment
Ах, если он находится внутри таблицы данных, вам нужно убедиться, что модель данных сохранена. Лучше всего поместить компонент в область видимости. См. также stackoverflow.com/questions/2118656/ - person BalusC; 06.09.2011
comment
Как можно связать событие p: ajax с компонентом jsf, например h: graphicImage? есть ли какая-либо документация для поддерживаемого события? - person Wafa; 01.04.2021