1

I have problem firing an ajax request with 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>

The first h:graphicImage opens the dialog correctly, the p:commandButton triggers the actionListener correctly, but the p:ajax has no effects (tested on googles app engine).

Update 1 Changing the event from onclick to click was absolutely right (thanks BalusC): Now the p:dialog is shown. But still the tag() method is not invoked. I've updated the xhtml-Code with f:metadata because there is one additional logging. I think it's related to p:ajax and the invocation of the bean, I've tried actionListener, action and listener (from the documentation of Primefaces) with the same result:

  • The app engines logs the invocation of getParameter(ComponentSystemEvent event) and Firebug shows this partial-update: <changes><update id="otCounter"><![CDATA[<span id="otCounter">0</span>]]></update>..
  • The invocation of public void tag(ActionEvent ae) is not logged (also tried public void tag())

The p:commandButton updates the counter correctly.

Update 2 I've removed the f:viewParam and f:event for simplicity and now are using listener and public void tag(), but the method is not called :-(

Update 3 The answer of BalusC is correct, I have other problems when using it here: JSF and p:ajax inside p:dataTable inside ui:repeat

Community
  • 1
  • 1
Thor
  • 6,607
  • 13
  • 62
  • 96

1 Answers1

4

The event name is wrong, it must be "click" without the on prefix.

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

The on prefix of events applies only the names of the HTML element attributes which provide a hook for the event handler. They do not represent full event names.

Note the <p:ajax> doesn't support the actionListener attribute. It has to be listener and should refer to a method which takes AjaxBehaviourEvent as argument (no arguments is also perfectly fine). This is exactly the same as on <f:ajax>.

BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555
  • Thanks BalusC, now the dialog is shown but still my bean method is not invoked. (I've updated the question) – Thor Sep 05 '11 at 14:50
  • See answer update, `actionListener` isn't supported by ``. Sorry, I didn't immediately see it as I don't know the whole PF vdl from top of head and assumed you to be right about that. – BalusC Sep 05 '11 at 15:17
  • Thanks for the update, but this issue still drives me crazy. I've explicitly tested again `listener` and the method `public void tag()`, but the method is not called :-( – Thor Sep 05 '11 at 15:36
  • Are you sure that this is been placed inside a ``? What if you use `` instead? (only remove that `onstart` for test). – BalusC Sep 05 '11 at 19:14
  • Yes, it's inside `h:form`. But additionally inside `ui:repeat` (where it works like a charm) and `p:datatable`. I think I've seen other related issues with 'p:datatable' and ajax requests and will look for them! – Thor Sep 06 '11 at 05:37
  • Ah if it is inside a datatable, you need to ensure that the datamodel is been preserved. Best is to put the bean in view scope. See also http://stackoverflow.com/questions/2118656/hcommandlink-hcommandbutton-is-not-being-invoked – BalusC Sep 06 '11 at 12:32
  • How it is possible to bind a p:ajax event to jsf component like h:graphicImage ? an is there any documentation for supported event ? – Wafa Apr 01 '21 at 16:15