发送的 Ajax 请求未定义触发的事件



我有一个最小、完整且可验证的示例按预期工作,有一个我还没有完成理解的问题。代码可以在下面看到,它的行为基本上包括从 PF ajaxized<p:selectOneListbox>列表中选择一个项,并在 JSF<h:outputText>元素上显示该项的值。

<h:form id="myform">
<p:selectOneListbox id="myselect" value="#{bean.optionSelected}">
<p:ajax listener="#{bean.onChange}" process="myselect" update="toupdate" onstart="onstart()" oncomplete="oncomplete()" onerror="onerror()" onsuccess="onsuccess()"/>
<f:selectItem itemLabel="Option 1" itemValue="1" />
<f:selectItem itemLabel="Option 2" itemValue="2" />
<f:selectItem itemLabel="Option 3" itemValue="3" />
</p:selectOneListbox>    
<h:outputText id="toupdate" value=">#{bean.optionSelected}" />
</form>

查看该元素,我不仅知道是什么特定事件导致 ajax 请求发送到服务器,也就是说,我不知道触发的事件是valuechange事件还是其他事件。换句话说,我错过了一个以这种方式编码的<p:ajax>元素:

<p:ajax event="name_of_the_event" .../>

而这个疑问让我不知道监听器方法在后备 Bean 端使用的接收事件的类:public void onChange(??? event)

任何澄清/解释将不胜感激。谢谢。

根据PrimeFaces下拉展示<p:ajax listener="..." /><p:selectOneListbox />将在用户选择不同的项目(onchange)时调用侦听器。

ajax 标签文档说event属性是可选的,并且:

用于触发 ajax 请求的客户端事件。默认值由行为附加到的父客户端行为持有者组件定义。

如果需要,p:ajax标记中的侦听器不需要包含任何参数

  • 调用以默认事件作为参数的方法
  • 调用不带任何参数的方法

所以<p:ajax listener="#{myBean.onAjaxAction}" />

会打电话

public void onAjaxAction(){
...
}

如果没有其他方法具有更匹配的方法签名。

如果要获得有关事件的详细信息,可以保留 EL 标识和服务器端添加事件。每个具体事件作为参数都应扩展javax.faces.event.AjaxBehaviorEvent

public void onAjaxAction(javax.faces.event.AjaxBehaviorEvent event) {
System.out.println(event.getClass())
}

然后,您可以检索事件源以及其他内容。如果您需要更多信息(如果可用),则需要使用更具体的事件类。如果您不知道具体的默认事件(及其相应的类)是什么,您可以添加上面的方法,并在方法中尝试检查具体事件(如System.out...中所做的那样)

对于许多PrimeFaces组件,文档中提到了事件。所有现有的PrimeFaces事件(针对所有组件)都可以在org/primefaces/event包中找到,因此在IDE中使用代码完成将为您提供选项(请注意,显然并非所有组件都适用于所有组件)。

如果文档中没有显式命名的事件,则基本的 dom 事件至少应该可以工作,包括 onchange。大多数情况下,对于输入,"onchange"是默认事件。

由于对于<p:selectOneListbox />,文档中没有提到显式事件,因此触发 ajax 请求的默认事件将是onchange。为此,如果需要,应将javax.faces.event.AjaxBehaviorEvent用作参数。

最新更新